スクリプトを作成しようとしていますが、以下の間に違いはないようです:
export k=1
と
k=1
私は正しいですか?
export
変数をサブプロセスで使用できるようにします。
つまり、スクリプトから新しいプロセスを生成した場合、それをk
使用しない限り、そのサブプロセスで変数を使用することはできませんexport
。サブプロセスでこの変数を変更した場合、その変更は親プロセスに表示されないことに注意してください。
詳細については、このドキュメントのセクション3.2.3を参照してください。
違いを示す簡単なスクリプトを作成しました。
$ 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
。
Windows 上であっても、すべてのプロセスには環境ブロックと呼ばれるメモリ ブロックがあり、これには環境変数が含まれます。新しいプロセスが作成されると、デフォルトでは、親プロセスの環境ブロックが子プロセスにコピーされるため、環境変数はテキスト データを子プロセスに渡す簡単な方法です。
このexport
コマンドは、環境変数を作成するか、通常のローカル変数を環境変数に変換します。C シェルでは、その数少ない償還機能の 1 つは、環境変数 ( setenv
) とローカル変数 ( ) に異なる構文を使用することset
です。Bash や Korn シェルなどの Bourne シェルの派生物は、そのすべてを隠します。
現在、単純な値のみを渡すことができるため、配列などの項目はサポートされていません (最初の要素をエクスポートするだけです)。define
子プロセスが同じタイプのシェル (bash の別のインスタンス) でない限り、を使用して設定された変数属性もエクスポートされません。これは、エクスポートされた関数にも適用されますが、異なるタイプのシェル間でこれをハックすることは可能です ( を使用eval
)。
Bash (およびその他) には、すべての変数が環境変数であることを意味するというシェル設定がありallexport
ます。一般的には、おそらく悪い考えです。を使用して C などの言語から別の環境ブロックを提供できexecve
ますが、シェルからは のようなプログラムが必要です。詳細についてはenv
、を参照man env
してください。