web-dev-qa-db-ja.com

〜/ .bash_profileでのPATHの設定とPATHのエクスポート

違いは何ですか?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も同じです。

そう:

  • 1)exportを使用するメリットと、PATHを明示的に設定するメリットは何ですか?
  • 2)適用した場合、バージョン1とバージョン2の間に機能的な違いはありますか?
  • 3)どちらを使用する必要がありますか?その理由は?
22
njboot

具体的に質問に答えるには:

  1. exportdoes$PATHを明示的に設定します。

  2. いいえ。exportは子プロセスの環境を設定しますが、$PATHは現在の環境にすでに設定されています。したがって、2番目の例では、コマンドが読み込まれたとき、およびbeforeexportが実行されます。$PATHの現在の環境の値は、$PATHに展開されます。語。

  3. 必要に応じて、快適な方を使用してください。どちらも機能的に違いはないので、これは主にスタイルの問題です。

POSIXは export builtin を定義しているので、

シェルは、指定された名前に対応する変数にexport属性を与えます。これにより、それらの変数は、後で実行されるコマンドの環境に置かれます。変数の名前の後に= Wordが続く場合、その変数の値はWordに設定されます。

私の別の answers から:

シェル変数と環境変数の宣言にはほとんど違いがありません。エクスポートは組み込みなので、次に呼び出されるプロセスの環境変数を宣言しますが、呼び出さない場合、そのプロセスはシェルのままなので、変数は2回評価されます。

exportを使用して2回評価しない限り、エクスポートされた変数にまったく影響を与えることなく、すべてのエクスポートを削除できます。 2回評価するということは、

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

代わりに次を使用してください:

set -a 

...スクリプトの上部。その後定義されるすべての変数は、自動的にexportedになります-これには、以前にexportedにしていない可能性がある変数が含まれます。または、スクリプトの一部に対してset -aのみを使用し、後でset +aを使用して設定を解除することもできます-関数としても機能します。

しかし、サブシェルはとにかく変数値を自動的に継承するので、

var1=value
( echo "$(echo "$var1")" )
value

その場合、exportを指定しても違いはありません。

ただし、スクリプトが別のスクリプト、またはexportedした値を解釈する他の実行可能ファイルを呼び出し、それらをexportで停止すると、それらの値は環境で使用できなくなります。次の例では、インタラクティブなシェルのプロンプトの内容を定義するシェル変数$PS1を使用して、exported変数のバリエーションが子プロセスにどのように影響するかを示します。

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ファイルは、そのシェルの存続期間中、変数値を設定します。したがって、これらのファイル内で設定およびexportedされた変数は、そのexport特性を維持し、シェルの存続期間中またはexportになるまで、そのシェルによって呼び出されたすべての子プロセスに対してunsetedになります。

ただし、bashexportビルトインを多少拡張して-nオプションを含めるように拡張しています。これにより、export属性を変数からunsettingせずに削除できますが、これは移植可能な動作ではありません。

13
mikeserv

これは同様のスレッドです

短い答え:

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
9
polym