PATH を設定する vs. ~/.bash_profile で PATH をエクスポートする

PATH を設定する vs. ~/.bash_profile で PATH をエクスポートする

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

ご質問に具体的にお答えします:

  1. export する明示的に設定します$PATH

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

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

POSIXは、export組み込みそれで:

シェルはexport指定された名前に対応する変数に属性を与え、その後に実行されるコマンドの環境内にそれらの変数が存在するようにします。変数名の後に= 単語の場合、その変数の値は次のように設定される。言葉

私の別の回答:

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

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

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

代わりに以下を使用します:

set -a 

...スクリプトの先頭で。その後に定義されるすべての変数は自動的に設定されますexported。これには、以前に編集しなかった変数も含まれます。または、スクリプトの一部のみに設定し、後で設定を解除することexportもできます。これは関数としても機能します。set -aset +a

ただし、サブシェルは変数値を自動的に継承するため、次のようになります。

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

exportその場合は違いはありません。

しかし、スクリプトが別のスクリプト、またはexported した値を解釈する他の実行可能ファイルを呼び出し、それらの値の使用を停止した場合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.profileexportexportexportunset

bashただし、組み込み関数を拡張してオプションexportを含めることは注目に値します。これにより、変数に ting せずに属性を-n削除できますが、これは移植可能な動作ではありません。exportunset

答え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

関連情報