~/.bash_profileからPATH設定とPATHをエクスポートする

~/.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それも同じだ。

だから:

  • export1) PATH を明示的に設定するのと比較して、PATH を使用するとどのような利点がありますか?
  • 2)バージョン1とバージョン2のアプリケーションに機能的な違いはありますか?
  • 3)どちらを使用しなければならず、その理由は何ですか?

答え1

お客様の質問に具体的に回答するには:

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

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

  3. 必要または快適であると思われるものを使用する必要があります。 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対話型シェルプロンプトの内容を定義するシェル変数を使用して、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

ENVシェル(たとえば、.bashrcまたは)から最初に呼び出されるすべてのファイルは、.profileそのシェルの寿命の変数値を設定します。したがって、exportこれらのファイルで設定および編集されたすべての変数はその属性をexport保持し、シェルの存続期間export中または呼び出されるまでそのシェルから呼び出されるすべての子プロセスで使用されますunset

ただし、オプションを含めるために組み込み関数をある程度bash拡張したことは注目に値します。これにより、変数を変更せずに変数からプロパティを削除できますが、移植可能な動作ではありません。export-nexportunset

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

関連情報