bashスクリプトファイルconfig.sh
があるとします。これは、他のスクリプトによってソース化されることを意図しており、定義された変数は、上位レベルのスクリプトのカスタマイズとして使用されます。bash:スクリプトをソース化しないファイルローカル変数を定義する
config.sh
に一時変数があり、その名前が上位レベルスクリプトの変数と競合すると、上位レベルのスクリプトが破損するという問題があります。
config.sh:
TMP1=abc
CONFIG_INPUT_DIR="$TMP1"/in
CONFIG_OUTPUT_DIR="$TMP1"/out
上位スクリプト:
TMP1=def
source config.sh
echo $TMP1
最後echo
プリントabc
、def
ありません。
ソリューション1つの
私の現在のソリューションは、競合することはほとんど不可能にするために、一時的な変数名にランダムな文字列を追加することです。例えば:
加えて、完璧ではないことが、痛みがあり、読み、コードはハードになりTMP1_vFc9Uiew=abc
CONFIG_INPUT_DIR="$TMP1_vFc9Uiew"/in
CONFIG_OUTPUT_DIR="$TMP1_vFc9Uiew"/out
unset TMP1_vFc9Uiew
。いくつかの検索後local
キーワード
を使用して2
ソリューションは、私がlocal
キーワードを知るようになりました。 しかし、単にTMP1
をlocal
と宣言すると、bashはconfig.sh: line 1: local: can only be used in a function
という文句を言います。
は、だから私のもう一つの解決策は、関数として全体configスクリプトを囲むことである。 メンテナンス性と可読性の前のソリューションよりも優れているが、1
を競合するだけでなく、解決するためにいくつかの可能性があります質問
矛盾することなく、より堅牢でスマートなソリューションを知りたいと思います。
ありがとうございました。
'ssh-agent'は' -c'と '-s'オプションを使って同様の手法を使います。 – jjlin
@jjlin:ありがとう!私は 'キーチェーン'が私が最初に見た場所ではないと思ったが、ドキュメントを見つけたのは最初だった。 :)おかしい、それは 'ssh-agent'のマンページにオープンしています。 – sarnold
@sarnold:ありがとう、ありがとう!私はこのテクニックを試してみます。 – niboshi