違いは何ですか?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
を使用するメリットと、PATHを明示的に設定するメリットは何ですか?具体的に質問に答えるには:
export
does$PATH
を明示的に設定します。
いいえ。export
は子プロセスの環境を設定しますが、$PATH
は現在の環境にすでに設定されています。したがって、2番目の例では、コマンドが読み込まれたとき、およびbeforeexport
が実行されます。$PATH
の現在の環境の値は、$PATH
に展開されます。語。
必要に応じて、快適な方を使用してください。どちらも機能的に違いはないので、これは主にスタイルの問題です。
POSIXは export
builtin を定義しているので、
シェルは、指定された名前に対応する変数に
export
属性を与えます。これにより、それらの変数は、後で実行されるコマンドの環境に置かれます。変数の名前の後に= Wordが続く場合、その変数の値はWordに設定されます。 。
私の別の answers から:
シェル変数と環境変数の宣言にはほとんど違いがありません。エクスポートは組み込みなので、次に呼び出されるプロセスの環境変数を宣言しますが、呼び出さない場合、そのプロセスはシェルのままなので、変数は2回評価されます。
export
を使用して2回評価しない限り、エクスポートされた変数にまったく影響を与えることなく、すべてのエクスポートを削除できます。 2回評価するということは、
var1=var2
export "${var1}=var3"
echo "$var2"
var3
代わりに次を使用してください:
set -a
...スクリプトの上部。その後定義されるすべての変数は、自動的にexported
になります-これには、以前にexport
edにしていない可能性がある変数が含まれます。または、スクリプトの一部に対してset -a
のみを使用し、後でset +a
を使用して設定を解除することもできます-関数としても機能します。
しかし、サブシェルはとにかく変数値を自動的に継承するので、
var1=value
( echo "$(echo "$var1")" )
value
その場合、export
を指定しても違いはありません。
ただし、スクリプトが別のスクリプト、またはexport
edした値を解釈する他の実行可能ファイルを呼び出し、それらを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
.bashrc
や.profile
などのシェルによって最初に呼び出されたENV
ファイルは、そのシェルの存続期間中、変数値を設定します。したがって、これらのファイル内で設定およびexport
edされた変数は、そのexport
特性を維持し、シェルの存続期間中またはexport
になるまで、そのシェルによって呼び出されたすべての子プロセスに対してunset
edになります。
ただし、bash
はexport
ビルトインを多少拡張して-n
オプションを含めるように拡張しています。これにより、export
属性を変数からunset
tingせずに削除できますが、これは移植可能な動作ではありません。
短い答え:
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