AFAICT、GNU Bash、またはその他の関連パッケージ(例:GNUコアツール)はGNU / Linuxディストリビューションで一般的であり、試行が失敗するように環境変数を定義する事前に作成された方法があります。見せる環境変数がすでに存在する場合は失敗します。基本的に変数割り当てのための「破壊なし」オプションであり、失敗時の終了状態はゼロではありません。
シェルパラメータ拡張(別名「パラメータの置き換え」)メソッドは中断を防ぎますが、失敗を報告しません。
unset MY_VARIABLE
: ${MY_VARIABLE:='my_value'}
: ${MY_VARIABLE:='this_will_fail_but_will_nevertheless_have_exit_code_0'}
echo $?
0
echo $MY_VARIABLE
my_value
私が思いついた最善の解決策は、safedef
この目的のために関数("")を作成することです。
die() {
echo -e >&2 "$@"
exit 1
}
safedef() {
if [ -v $1 ]; then
die 'Name conflict. Variable already defined. Will not overwrite it.'
else
# Create and assign environment variable
export $1="${*:2}"
fi
}
safedef MY_VARIABLE 'my_value'
safedef MY_OTHER_VARIABLE 'my_other_value'
# Etc, etc...
質問:
- これを達成するためにすでに作られた方法を見落としたのではないでしょうか?フリーソフトウェア利用可能なパッケージの一部または全部主流のGNU/Linuxディストリビューション?
- 私が見落としている一種のバグはありますか?
safedef
つまり、期待どおりに予期せず動作しない可能性が最も高いのでしょうか? (もしそうなら、エラーは何ですか?より良いアプローチは何ですか?)
ベストアンサー1
Bashで以下を見つけました。
unset MY_VARIABLE
: ${MY_VARIABLE='my_value'}
MY_VARIABLE=${MY_VARIABLE:+$( false )}${MY_VARIABLE:-'this_will_fail_with_exit_1'}
echo $?
echo $MY_VARIABLE
これは以下を印刷します:
1
my_value