2012-09-24 8 views

答えて

14

すべてのプロセスは、Windowsであっても、環境ブロックとして知られているメモリのブロックを持っている、これは環境変数が含まれています。新しいプロセスが作成されると、デフォルトで親プロセスの環境ブロックが子プロセスにコピーされるので、環境変数はテキストデータを子プロセスに渡す簡単な方法です。

exportコマンドは、環境変数を作成するか、通常のローカル変数を環境変数に変換します。 Cシェルでは、環境変数(setenv)とローカル変数(set)に対して異なる構文を使用しています。 BourneシェルとKornシェルのようなBourneシェルの派生物は、すべてを隠します。

現在のところ、単純な値だけを渡すことができるので、配列のような項目はサポートされていません(最初の要素をエクスポートするだけです)。 defineを使用して設定された変数属性も、子プロセスが同じタイプのシェル(bashの別のインスタンス)でない限り、エクスポートされません。これはエクスポートされた関数にも当てはまりますが、異なるタイプのシェル間でこれをハックすることは可能です(evalを使用)。

バッシュ(その他)では

すべての変数は、環境変数であることを意味allexportというシェル設定がある - 一般的にそれ自体におそらく悪いアイデアが。Cなどの言語から異なる環境ブロックをexecveを使用して提供することができますが、シェルからenvのようなプログラムが必要な場合は、man envを参照してください。

34

exportは、変数をサブプロセスで使用できるようにします。

つまり、スクリプトから新しいプロセスを生成すると、という変数は、export以外の場合、そのサブプロセスで使用できなくなります。サブプロセスでこの変数を変更した場合、は親プロセスでが表示されないことに注意してください。

詳細については、セクション3.2.3のthis docを参照してください。

+0

簡潔な点です。 +1 –

18

私は違いを示すために簡単なスクリプトを作成しました:値が知られている

$ cat script.sh 
echo $answer 

レッツ・テスト

$ answer=42 
$ ./script.sh 

$ . script.sh 
42 

exportなしにのみスクリプトを実行するために同じプロセスを使用している場合(つまり、同じbashインスタンス、source/.を使用)

次に、exportを使用して:

$ export answer=42 
$ ./script.sh 
42 
$ . script.sh 
42 

値がサブプロセスに知られています。

したがって、変数の値をサブプロセスが認識できるようにするには、exportを使用する必要があります。

関連する問題