2011-12-22 8 views
28

いくつかの環境変数を設定するために呼び出せるシェルスクリプトを使用したいと思います。しかし、スクリプトの実行後には、bashで "printenv"を使用している環境変数は表示されません。ここでシェルスクリプトの環境変数を設定しても、シェルに表示されません。

は私のスクリプトです:私は "./test.sh" を行うと

#!/bin/bash 

echo "Hello!" 
export MYVAR=boubou 
echo "After setting MYVAR!" 

、私は次を参照してください。私は "printenvはMYVAR" を行うと

Hello! 
After setting MYVAR! 

、私は何も表示されません。

私が間違っていることを教えてもらえますか?

答えて

49

これは環境変数がどのように機能するかを示しています。すべてのプロセスには環境のコピーがあります。プロセスがそのコピーに対して行うすべての変更は、プロセスの子プロセスに伝播します。ただし、プロセスの親には伝播しません。これを回避するために

一つの方法は、sourceコマンドを使用することです:

source ./test.sh 

または

. ./test.sh 

(2つの形式が同義です)。

サブシェルでスクリプトを実行する代わりに、bashは、プロンプトで入力されたかのようにスクリプト内の各コマンドを実行します。

+0

それは動作しますが、なぜ「のbash test.shは、」環境変数を設定しないのですか? bashがプロンプトに入力されたかのようにスクリプト内の各コマンドを実行すると、環境変数は現在のプロセスに設定されますか? – GDICommander

+2

@GDICommander:いいえ、 'bash test.sh'を実行すると、スクリプト**を実行して**を終了する新しい' bash'プロセスが作成されます。 – NPE

+1

よろしくお願いします。今、私は環境変数を少し良く理解しています。 – GDICommander

3

別の方法としては、スクリプト印刷あなたはecho export VAR=valueで、設定し、メインシェルでeval "$(./test.sh)"をしたい変数を持っているだろう。これは、さまざまなプログラムで使用されているアプローチです。サイズ変更、dircolors]を設定する環境変数を提供します。

のみ動作スクリプトは、他の出力を持っていない場合(または任意の他の出力は>&2と、標準エラー出力に表示された場合)

+0

なぜdownvote?これは共通のパターンであり、いくつかの利点があります。 – Random832

+0

これは私には役に立たなかった。ごめんなさい。 – FractalSpace

関連する問題