安全地定义环境变量

安全地定义环境变量

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...

问题:

  1. 我是否忽略了一个现成的方法来实现这一目标,由自由软件部分或全部可用的软件包主流 GNU/Linux 发行版
  2. 我是否忽略了某种错误,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

相关内容