複数のAmazonEC2アカウントを持っており、$EC2_HOMEなどの変数をすばやく切り替えられるようにしたいと考えています。スクリプト。

次のようにシェルスクリプトを設定しています:

#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME 

スクリプトを実行すると、EC2_HOMEが設定されていますが、exportを使用すると、スクリプトの完了後に変数が固定されると思いました。 echo $EC_HOMEを実行しても何も表示されないため、表示されません。

これは非常に初歩的なLinuxスクリプトの知識である必要があることはわかっていますが、わかりません。運が悪かったので、関連する質問を探してみました。これが重複している場合は、お詫びします。

回答

スクリプトを入手する必要があります。

. ./script 

または

source ./script 

コメント

  • その理由は、スクリプトが現在のシェルの子として新しいシェルプロセスを生成するためです。子プロセスで行った環境の変更は、親に影響を与えることはできません。<を使用する場合div id = "323cc66047">

またはsource、新しい子プロセスを生成しておらず、現在のシェルでコマンドを実行しています。

  • @glennjackman同様の問題があり、解決策を試しましたが、.またはsourceを実行するとシェルからログオフします。なぜこれが起こるのかペニング?
  • @Patryk:スクリプトにexitステートメントが含まれている可能性があるため、ソースとしては適していません。
  • source ./scriptは完全に正常に機能します。sudo source ./script.shsudo: source: command not foundと言います。 sudoを使用してこれを行うにはどうすればよいですか?
  • @ 71GA:sudoのコンパイル設定と、/etc/sudoers sudoを使用してコマンドを実行すると、環境を保持できる場合とできない場合があります。スクリプトを入手してから、を-Eオプションで実行して環境を保護することをお勧めします。うまくいかない場合は、できることはほとんどないと思います。
  • 回答

    実行するときスクリプトは独自のシェルと独自の環境を取得しますが、スクリプトが終了するとすぐに消えます。環境変数を維持するには、スクリプトを現在のシェルにソースします。

    $ source ./a.sh 

    または同等に(ただし、もう少し移植性が高い) POSIXドットコマンド:

    $ . ./a.sh 

    次に、定義が現在のシェルの環境に配置され、継承されます

    スクリプトの実行に近づくために、. a.shPATH環境変数。


    これらの動作、および.

    は同じです(またはまったく存在しません)。. ./a.shは、すべてのPOSIX互換シェルで確実に同じように動作しますが、source.、および. a.sh. ./a.shは異なる場合があります。Bashの場合 source.はすべての場合で同じです。 zsh sourceの場合は常に現在のディレクトリを最初にチェックします。 kshは基本的に似ています。

    スクリプト名がパス(/を含む)として指定されている場合、そのパスが直接使用されますすべての場合において。最も移植性の高い信頼できる方法は、. ./scriptまたは. /path/to/scriptです。

    回答

    記録のために。

    envをシステムにエクスポートするインターネットからスクリプトを実行する場合

    次の形式を使用できます

    source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh) 

    例:

    source <(curl -s -L https://example.com/install.sh) 

    コメント

    • 危険に見えますが、そのスクリプトを信頼する場合は便利です!

    回答

    試してください

    exec ./script 

    execコマンドは、非対話型シェルを開始せずに、現在のシェルでスクリプトを実行します。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です