すべてのPATH類似変数にディレクトリを追加する

すべてのPATH類似変数にディレクトリを追加する

すべてのパスのような変数にルートフォルダを追加する機能はありますか?現在私はこの機能を使用しています:

function prepend_paths() {
    ROOT_PATH=$(readlink -f $1)
    export PATH=$ROOT_PATH/bin:$PATH
    export LD_LIBARY_PATH=$ROOT_PATH/lib:$LD_LIBARY_PATH
    export LD_LIBARY_PATH=$ROOT_PATH/lib64:$LD_LIBARY_PATH
    export C_INCLUDE_PATH=$ROOT_PATH/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=$ROOT_PATH/include:$CPLUS_INCLUDE_PATH
    export PYTHONPATH=$ROOT_PATH/lib/python3.5/site-packages:$PYTHONPATH
    export MANPATH=$ROOT_PATH/share/man:$MANPATH
}

しかし、それが完全なものかどうかはわかりません。

私は時々この機能が好きな人が私だけではないので、この機能を実行するための既存の方法があるべきだと思いました。しかし、これまで私は何も見つかりませんでした。

答え1

これはexport割り当てと同じではありません。次のことをしたいようです。

function prepend_paths() {
    for P in $(env | grep PATH | sed 's/=.*//') ; do
        eval $P=${1}:\$$P ;
    done
}

つまり、名前に「PATH」を含むすべての環境変数に指定されたプレフィックスを追加します。含まれている$(env ..)サブコマンドは変数名のリストを提供します。 forループ本体の作業行はcallを介して割り当てを行いますeval。これは二重計算を便利に行いますP(最初に変数名で、その後はその変数の値として)。

その後、これらの割り当ては、「このシェル」に保存され、「エクスポート済み」とマークされたすべての変数が子プロセスに伝播されます。もちろんexport $P、必要に応じて明示的な説明を追加することができ、それが良いと思われる場合は、出力を印刷してジョブを報告することもできます。

答え2

「これは徹底的か?」という質問が面白い。PATH同様の変数のリストはどのように完全にできますか?上記のように、PATHほとんどのシェルはそれを尊重します。LD_LIBARY_PATHほとんどのプログラムでも認識されます。PYTHONPATHPythonの実行可能ファイルは実際に尊重されています。しかし、明日どのようなプログラムをインストールするのかわからないので、以前PATHにどのような変数を設定するのかをどうやって知ることができますか?

私はJavaを考えCLASSPATHました。しかし、仮想プログラムを作成しましょう。以前にこの変数をどのように知っていましたか?たぶん他のプログラムは他の同様の変数を尊重しますが、その変数が次のように設定されるとは思わないかもしれません。suENV_ROOTPATHfoo.exeSOME_WEIRD_PATH_VARIABLE_NAMEPATHPATH_SETファイルパス1ただし、またはに設定することもできます0。私たちはPATH_SET何を設定するのかわかりませんpwd、そうですか? :-)

関連情報