web-dev-qa-db-ja.com

シェルスクリプトで環境変数を「エクスポート」する方法を教えてください。

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

次のように設定したシェルスクリプトがあります。

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

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

これは非常に初歩的なLinuxスクリプティングの知識でなければならないことは知っていますが、それは知りません。私は運が悪いのに関連する質問を探してみました-これが重複している場合は私の謝罪。

65
cwd

あなたはあなたのスクリプトを調達する必要があります

. ./script

または

source ./script
70
enzotib

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

$ source ./a.sh

または同等に(ただし、もう少し移植性があります) POSIXドットコマンド を使用します

$ . ./a.sh

次に、定義は現在のシェルの環境に入れられ、そこから起動するすべてのプログラムに継承されます。

スクリプトの実行に近づけるには、. a.shは、PATH環境変数のディレクトリを検索してa.shを見つけます。


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

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

38
Michael Homer

参考までに。

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

次の形式を使用できます

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

例えば:

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