假设我想在运行命令的各种咒语之前重复相同的环境变量字符串
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
有没有办法将它们结合起来?一些选项
通过设置它们
export
export TZ=GMT export LC_ALL=C export LONG_ENV_VAR=foo if [[ ]] # ...
这可行,但我不想让它们继续设置在环境中。
尝试创建一个变量变量!
local cmd_args="TZ=GMT LC_ALL=C LONG_ENV_VAR=foo"
不幸的是,当我尝试通过以下方式运行它时:
$cmd_args my_command
我有
TZ=GMT: command not found
。每次只需将它们全部列出即可。
我也尝试过谷歌搜索,但“环境变量变量”并不是最容易搜索的术语,而且我没有找到任何结果。我在#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 "$@"
记住:一个空的"$@"
!= ""
。只是不在那里。