Bash設定ファイルをカスタマイズする際の違いは何ですか?どちらが良いですか?このコマンドexport
は組み込みコマンドなので、これに関する文書はほとんどありません。
私の ~/.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
それも同じだ。
だから:
export
1) PATH を明示的に設定するのと比較して、PATH を使用するとどのような利点がありますか?- 2)バージョン1とバージョン2のアプリケーションに機能的な違いはありますか?
- 3)どちらを使用しなければならず、その理由は何ですか?
答え1
お客様の質問に具体的に回答するには:
export
する明示的に設定されます$PATH
。いいえ。
export
子プロセスの環境を設定しますが、$PATH
現在の環境にはすでに設定されています。したがって、2番目の例では、コマンドを-と今後export
実行済み - 現在の環境の値が単語$PATH
に展開されます$PATH
。必要または快適であると思われるものを使用する必要があります。 2つの間に機能的な違いはないので、ほとんどのスタイルの問題です。
POSIXは定義しますexport
組み込みだから:
シェルは、
export
指定された名前に対応する変数に属性を割り当てる必要があります。これは、後で実行されるコマンドのコンテキストにその属性を配置します。変数名が続く場合=単語この場合、この変数の値を次に設定する必要があります。言葉。
私からもう一つ回答:
シェル変数宣言と環境変数宣言に違いはありません。エクスポートは組み込み関数なので、次の呼び出しプロセスの環境変数を宣言しますが、プロセスを呼び出さない場合、プロセスはまだシェルであるため、変数は2回評価されます。
二重評価を使用しない限り、エクスポートされたexport
変数に影響を与えずにすべてのエクスポートを削除できます。 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
環境export
でその値を使用できなくなります。次の例は、$PS1
対話型シェルプロンプトの内容を定義するシェル変数を使用して、export
ed変数に対する変更が子プロセスにどのように影響するかを示しています。
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
-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