25

スクリプトを作成しようとしていますが、以下の間に違いはないようです:

export k=1

k=1

私は正しいですか?

4

3 に答える 3

42

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

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

詳細については、このドキュメントのセクション3.2.3を参照してください。

于 2012-09-24T08:53:30.857 に答える
24

違いを示す簡単なスクリプトを作成しました。

$ cat script.sh 
echo $answer

なしでテストしましょうexport

$ answer=42
$ ./script.sh 

$ . script.sh 
42

値は、同じプロセスを使用してスクリプトを実行する場合 (つまり、/を使用して同じbashインスタンスを使用する場合)にのみ認識されます。source.

今、使用してexport

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

値はサブプロセスに認識されます。

したがって、変数の値をサブプロセスに認識させたい場合は、 を使用する必要がありますexport

于 2012-09-24T09:01:31.640 に答える
15

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

このexportコマンドは、環境変数を作成するか、通常のローカル変数を環境変数に変換します。C シェルでは、その数少ない償還機能の 1 つは、環境変数 ( setenv) とローカル変数 ( ) に異なる構文を使用することsetです。Bash や Korn シェルなどの Bourne シェルの派生物は、そのすべてを隠します。

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

Bash (およびその他) には、すべての変数が環境変数であることを意味するというシェル設定がありallexportます。一般的には、おそらく悪い考えです。を使用して C などの言語から別の環境ブロックを提供できexecveますが、シェルからは のようなプログラムが必要です。詳細についてはenv、を参照man envしてください。

于 2012-09-24T10:04:58.340 に答える