2

私は簡単なbashスクリプトを持っています:

#!/bin/bash
JAVA_HOME=/usr
EC2_HOME=~/ec2-api
echo $EC2_HOME
export PATH=$PATH:$EC2_HOME/bin

私はそのようにスクリプトを実行します

$ ./ec2
/Users/user/ec2-api

スクリプトが実行され、正しい出力が生成されます。

ただし、EC2_HOME変数にアクセスしようとすると、何も表示されません。

$ echo $EC2_HOME

空白の文字列が返されます。私は何が間違っているのですか?

4

2 に答える 2

4

代わりに、次のいずれかを実行してください。

source ec2

また

. ec2

.表記は単なるショートカットであることに注意してくださいsource

説明:

  • これは、./ec2実際に現在のシェルからサブシェルを生成してスクリプトを実行し、サブシェルが生成元の親シェルの環境に影響を与えることができないためです。
  • したがって、サブシェルで正しくEC2_HOME設定されます/Users/user/ec2-api(同様に、PATH環境変数が更新され、サブシェルでも正しくエクスポートされます)が、これらの変更は親シェルに伝播されません。
  • を使用sourceすると、サブシェルを生成せずに現在のシェルでスクリプトが直接実行されるため、加えられた変更は保持されます。
  • (注export:exportは、現在のシェルから生成された新しいシェルに、現在のシェルからエクスポートされた変数を使用するように指示するために使用されます。したがって、現在のシェルでのみ使用する変数については、エクスポートする必要はありません。)
于 2012-11-15T19:06:32.927 に答える
0

シェルスクリプトは、親の環境を変更することはできません。問題を解決するには、ドット(。)コマンドを使用できます。

$ . ./ec2

そしてそれはうまくいくはずです。cshellでは、

% source ./ec2

シェルとスクリプトの詳細については、私の最高のリソースは、はるかにUnixのパワーツールです。

于 2012-11-15T19:17:09.397 に答える