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


54

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

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

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

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

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

回答:


60

スクリプトをソースする必要があります

. ./script

または

source ./script

19
その理由は、スクリプトが現在のシェルの子として新しいシェルプロセスを生成するためです。子プロセスで環境を変更しても、親に影響を与えることはできません。.またはを使用するとsource、新しい子プロセスが生成されず、現在のシェルでコマンドが実行されます。
グレンジャックマン

1
@glennjackman私は同様の問題を抱えていると私はあなたのソリューションを試してみましたが、私はやるときには、シェルから私をログオフ.またはsource。なぜこうなった ?
パトリク

7
@Patryk:スクリプトにexitステートメントが含まれている可能性があるため、ソース化するのは適切ではありません。
enzotib

source ./script完全に機能する一方で、sudo source ./script.shと言いsudo: source: command not foundます。sudoを使用してこれを行うにはどうすればよいですか?
71GA 14

1
@ 71GA:sudoでの環境設定を/etc/sudoers保存することができるかできないかで、コンパイル設定と構成設定に依存しますsudo。スクリプトsudo-E入手してから、環境を保持するオプションで実行することをお勧めします。うまくいかない場合、できることはほとんどないと思います。
エンゾチブ14

35

スクリプトを実行すると、独自のシェルと独自の環境が取得され、スクリプトが終了するとすぐに再び消えます。環境変数を保持するには、スクリプトを現在のシェルに取り込みます。

$ source ./a.sh

または同等に(ただし、より移植性が高い)POSIXドットコマンドを使用します。

$ . ./a.sh

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

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


これらがどのように振る舞うか、および同じである(またはまったく存在する)かどうか.sourceは微妙な点があります。. ./a.sh間違いなく、すべてのPOSIX互換のシェルで同じように動作しますが、source.、と. a.sh. ./a.sh、異なる場合があります。Bashのためのsource.同じですすべての場合には、以下のためのzsh sourceは常に最初にカレントディレクトリをチェックします。kshは基本的に似ています。

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


1

記録のためだけに。

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

次の形式を使用できます

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

例えば:

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

危険に見えますが、そのスクリプトを信頼している場合は便利です!
マークスチュワート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.