Linuxパス環境/etc/profile.d/*.shを設定して2回実行するのは混乱していますか?

Linuxパス環境/etc/profile.d/*.shを設定して2回実行するのは混乱していますか?

PKG_CONFIG_PATHをCentOSに設定しようとしています。以下は私が試しているコードです。

export |grep PKG_CONFIG_PATH

出力できません。

echo "$PKG_CONFIG_PATH"
:/usr/local/lib/pkgconfig

ここに出力があるのはなぜですか? ?

もし私が

sudo sh -c "echo 'export PKG_CONFIG_PATH=$PKG_CONFIG_PATH :/usr/local/lib/pkgconfig' >> /etc/profile.d/path.sh
source /etc/profile.d/path.sh

これで同じパスが2回表示されます。

export |grep PKG_CONFIG_PATH
declare -x PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig:/usr/local/lib/pkgconfig

それでは、パスがまだ設定されていない場合、$PKG_CONFIG_PATHはどこから来るのでしょうか?

更新された編集: 再起動後に変数が消去されるため、質問の最初の部分は実際には重要ではありません。

本当の問題は、profile.dのファイルが/etc/bashrcによって2回呼び出され、/etc/profileによって1回呼び出されるためだと思います。 WTHに聞くことができますか?なぜこれが起こるのですか?ワーム?誤式?

ベストアンサー1

それは違いです。出口そして非輸出環境変数

このexportコマンドはリストのみをリストします。エクスポートした環境変数exportつまり、シェルが親プロセスから継承したか、またはコマンドdeclare -xを使用してエクスポート可能としてマークしたため、子プロセスから継承可能とマークされた変数です。

エクスポートされていない変数はスクリプト内で使用できますが、子プロセスの環境を妨げないため、スクリプトに役立ちます。

エクスポートされない変数を設定するには、name=value次の構文のみを使用します。

$ FOO=bar
$ echo $FOO
bar
export | grep FOO
$

後で変数をエクスポート可能としてマークできます。

...
$ export FOO
$ export | grep FOO
declare -x FOO="bar"

実際に古典的なBourneシェル必須2段階のプロセスで環境変数を初期化できます。まず、値を設定してからエクスポート可能としてマークします。したがって、最大の移植性のために設計されたシェルスクリプトでは、この構文を引き続き表示できます。

FOO=bar
export FOO

最新のシェルを使用すると、これを1つの手順で実行できます。

$ export FOO=bar

したがって、あなたの場合は、以前にPKG_CONFIG_PATH=:/usr/local/lib/pkgconfig手動で行ったか、源泉スクリプトまたはログインスクリプトの一部として。

おすすめ記事