複数の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
、新しい子プロセスを生成しておらず、現在のシェルでコマンドを実行しています。
.
またはsource
を実行するとシェルからログオフします。なぜこれが起こるのかペニング?exit
ステートメントが含まれている可能性があるため、ソースとしては適していません。source ./script
は完全に正常に機能します。sudo source ./script.sh
はsudo: source: command not found
と言います。 sudoを使用してこれを行うにはどうすればよいですか?sudo
のコンパイル設定と、/etc/sudoers
sudo
を使用してコマンドを実行すると、環境を保持できる場合とできない場合があります。スクリプトを入手してから、を-E
オプションで実行して環境を保護することをお勧めします。うまくいかない場合は、できることはほとんどないと思います。回答
実行するときスクリプトは独自のシェルと独自の環境を取得しますが、スクリプトが終了するとすぐに消えます。環境変数を維持するには、スクリプトを現在のシェルにソースします。
$ source ./a.sh
または同等に(ただし、もう少し移植性が高い) POSIXドットコマンド:
$ . ./a.sh
次に、定義が現在のシェルの環境に配置され、継承されます
スクリプトの実行に近づくために、. a.sh
はPATH
環境変数。
これらの動作、および は同じです(またはまったく存在しません)。.
と. ./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コマンドは、非対話型シェルを開始せずに、現在のシェルでスクリプトを実行します。