web-dev-qa-db-ja.com

「エクスポート」はシェルプログラミングで何をしますか?

私が知る限り、変数の割り当ては、「export」が前にあるかどうかにかかわらず同じです。何のために?

109
John Bachir

$HOME$PATHなどのエクスポートされた変数は、環境変数としてそれらをエクスポートするシェル(およびそれらの他のプログラムによって実行されるプログラムなど)によって実行される他のプログラムで使用できます(継承)。通常の(エクスポートされていない)変数は、他のプログラムでは使用できません。

$ env | grep '^variable='
$                                 # No environment variable called variable
$ variable=Hello                  # Create local (non-exported) variable with value
$ env | grep '^variable='
$                                 # Still no environment variable called variable
$ export variable                 # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye   # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$

詳細については、GNU Bashマニュアルの export builtin のエントリ、および コマンド実行環境 のセクションを参照してください。 環境

エクスポートされていない変数は、( ... )および同様の表記法で実行されるサブシェルで使用できることに注意してください。これらのサブシェルはメインシェルの直接クローンであるためです。

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

サブシェルは、エクスポートされているかどうかにかかわらず、任意の変数の独自のコピーを変更でき、実行するプロセスから見た値に影響を与える可能性がありますが、もちろんサブシェルの変更は親シェルの変数に影響を与えることはできません。

サブシェルに関するいくつかの情報は、Bashマニュアルの command grouping および command execution environment にあります。

126

これにより、割り当てがサブプロセスから見えるようになります。

jcomeau@intrepid:~/rentacoder/bin2txt$ foo=bar
jcomeau@intrepid:~/rentacoder/bin2txt$ bash -c 'echo $foo'

jcomeau@intrepid:~/rentacoder/bin2txt$ export foo
jcomeau@intrepid:~/rentacoder/bin2txt$ bash -c 'echo $foo'
bar
54
jcomeau_ictx

まあ、それは一般的にシェルに依存します。 bashの場合、変数を「エクスポート可能」としてマークします。これは、実行するすべての子プロセスの環境に変数が表示されることを意味します。

エクスポートされていない変数は、currentプロセス(シェル)からのみ表示されます。

bash manページから:

export [-fn] [name[=Word]] ...
export -p

指定された名前は、その後実行されるコマンドの環境への自動エクスポート用にマークされます。

-fオプションが指定されている場合、名前は関数を参照します。名前が指定されていない場合、または-pオプションが指定されている場合、このシェルでエクスポートされるすべての名前のリストが出力されます。

-nオプションを使用すると、各名前からエクスポートプロパティが削除されます。

変数名の後に=Wordが続く場合、変数の値はWordに設定されます。

exportは、無効なオプションが検出された場合、名前の1つが有効なシェル変数名でない場合、または-fに関数ではない名前が指定されない限り、終了ステータス0を返します。

typesetコマンドを使用して変数をエクスポート可能に設定し、set -aを使用して、将来の変数の作成または変更をすべて自動的にマークすることもできます。

17
paxdiablo