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