将多个环境变量分配给单个变量并根据命令展开它们

将多个环境变量分配给单个变量并根据命令展开它们

假设我想在运行命令的各种咒语之前重复相同的环境变量字符串

if [[ some_thing ]]; then
    TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command
elif [[ some_other_thing ]]; then
    TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command --with-arg
else
    TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command --with-other-arg
fi

有没有办法将它们结合起来?一些选项

  1. 通过设置它们export

    export TZ=GMT
    export LC_ALL=C
    export LONG_ENV_VAR=foo
    if [[ ]] # ...
    

    这可行,但我不想让它们继续设置在环境中。

  2. 尝试创建一个变量变量!

    local cmd_args="TZ=GMT LC_ALL=C LONG_ENV_VAR=foo"
    

    不幸的是,当我尝试通过以下方式运行它时:

    $cmd_args my_command
    

    我有TZ=GMT: command not found

  3. 每次只需将它们全部列出即可。

我也尝试过谷歌搜索,但“环境变量变量”并不是最容易搜索的术语,而且我没有找到任何结果。我在#2 中尝试做的事情有解决办法吗?或者我是否坚持使用 #1 的某个版本并随后取消设置变量?

答案1

我可能会为此使用子外壳:

(
  export TZ=GMT LC_ALL=C LONG_ENV_VAR=foo
  if [[ some_thing ]]; then
    exec my_command
  fi
)

这使您可以一次清楚地设置变量;让它们出现在您在子 shell 中运行的任何内容中,并且也不出现在主 shell 的环境中。

答案2

有多种方法可以做到这一点。就我个人而言,我觉得功能更清晰:

run_this(){
   TZ=GMT LC_ALL=C LONG_ENV_VAR=foo "$@"
}

if [[ some_thing ]]; then
    run_this my_command
elif [[ some_other_thing ]]; then
    run_this my_command --with-arg
else
    run_this my_command --with-other-arg
fi 

答案3

第 2 点可以通过以下方式实现env

local env_args="greppable1=foo greppable2=bar"
env $env_args perl -E 'say for grep /greppable/, keys %ENV'

不过,如果任何 env 参数中有空格,bash 分词规则可能会让这变得复杂。

答案4

这就是你的 arg 数组的用途:

if    thing
then  set --
elif  something
then  set -- --with_arg
else  set -- --other_arg
fi&&  TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command "$@"

记住:一个空的"$@"!= ""。只是不在那里

相关内容