すべてのパスのような変数にルートフォルダを追加する機能はありますか?現在私はこの機能を使用しています:
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
ほとんどのプログラムでも認識されます。PYTHONPATH
Pythonの実行可能ファイルは実際に尊重されています。しかし、明日どのようなプログラムをインストールするのかわからないので、以前PATH
にどのような変数を設定するのかをどうやって知ることができますか?
私はJavaを考えCLASSPATH
ました。しかし、仮想プログラムを作成しましょう。以前にこの変数をどのように知っていましたか?たぶん他のプログラムは他の同様の変数を尊重しますが、その変数が次のように設定されるとは思わないかもしれません。su
ENV_ROOTPATH
foo.exe
SOME_WEIRD_PATH_VARIABLE_NAME
PATH
PATH_SET
ファイルパス1
ただし、またはに設定することもできます0
。私たちはPATH_SET
何を設定するのかわかりませんpwd
、そうですか? :-)