違いは何ですか? bash プロファイルをカスタマイズするときにどちらを使用するのがよいでしょうか?export
組み込みの cmd であるため、コマンドに関するドキュメントはほとんどありません。
私の ~/.bash_profile バージョン 1 からの抜粋:
#PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin
#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH
出力元:echo $PATH
/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin
バージョン2からの抜粋:
#PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin
#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH
からの出力はecho $PATH
バージョン 1 と同じですenv
。 も同様です。
それで:
- 1) PATH を明示的に設定するのではなく、使用することによる利点は何ですか
export
? - 2) バージョン 1 とバージョン 2 を適用した場合、機能上の違いはありますか?
- 3) どちらを使用すべきですか? また、その理由は何ですか?
答え1
ご質問に具体的にお答えします:
export
する明示的に設定します$PATH
。いいえ。
export
子プロセスの環境を設定しますが、$PATH
現在の環境にはすでに設定されています。したがって、2番目の例では、コマンドが読み込まれると、前にexport
が実行されると、現在の環境の for の値$PATH
が単語に展開されます$PATH
。必要かつ快適な方を使用してください。どちらも機能的には違いがないので、これは主にスタイルの問題です。
POSIXは、export
組み込みそれで:
シェルは
export
指定された名前に対応する変数に属性を与え、その後に実行されるコマンドの環境内にそれらの変数が存在するようにします。変数名の後に= 単語の場合、その変数の値は次のように設定される。言葉。
私の別の回答:
シェル変数と環境変数の宣言にはほとんど違いはありません。export は組み込み関数なので、次に呼び出されるプロセスに対して環境変数を宣言しますが、環境変数を呼び出さない場合はそのプロセスはシェルのままなので、変数は 2 回評価されます。
export
2 回評価しない限り、エクスポートされた変数にまったく影響を与えることなく、すべてのエクスポートを削除できます。2 回評価するとは、次のことを意味します。
var1=var2
export "${var1}=var3"
echo "$var2"
var3
代わりに以下を使用します:
set -a
...スクリプトの先頭で。その後に定義されるすべての変数は自動的に設定されますexported
。これには、以前に編集しなかった変数も含まれます。または、スクリプトの一部のみに設定し、後で設定を解除することexport
もできます。これは関数としても機能します。set -a
set +a
ただし、サブシェルは変数値を自動的に継承するため、次のようになります。
var1=value
( echo "$(echo "$var1")" )
value
export
その場合は違いはありません。
しかし、スクリプトが別のスクリプト、またはexport
ed した値を解釈する他の実行可能ファイルを呼び出し、それらの値の使用を停止した場合export
、それらの値はその環境で使用できなくなります。次の例では、対話型シェルのプロンプトの内容を定義するシェル変数を使用して、 ed 変数のバリエーションが子プロセス$PS1
にどのように影響するかを示します。export
export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
this is another executable
> exit
exit
しかし ...
PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
sh-4.3$ exit
exit
しかし、プロセスを呼び出すときに環境変数を明示的に宣言すると...
PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}
###OUTPUT###
this is another executable
> exit
exit
sh-4.3$ exit
exit
またはENV
などのシェルによって最初に呼び出されるファイルはいずれも、そのシェルの存続期間中は変数値を設定します。したがって、それらのファイル内で設定および編集された変数は、その特性を維持し、シェルの存続期間中または されるまで、そのシェルによって呼び出されるすべての子プロセスに適用されます。.bashrc
.profile
export
export
export
unset
bash
ただし、組み込み関数を拡張してオプションexport
を含めることは注目に値します。これにより、変数に ting せずに属性を-n
削除できますが、これは移植可能な動作ではありません。export
unset
答え2
短い答え:
https://superuser.com/a/153378/333431
エクスポートされた変数は子プロセスに渡されますが、エクスポートされていない変数は渡されません。
つまり、export
サブシェルで変数を使用する場合は、変数を使用する必要があります。
これをテストすることができます:
$ TEST="im_not_here"
$ echo $TEST
im_not_here
$ bash -c 'echo $TEST'
<empty output>
$ export TEST2="im_here"
$ echo $TEST2
im_here
$ bash -c 'echo $TEST2'
im_here