我可以这样设置环境变量。
➤ foo=bar env | grep foo
foo=bar
但是,如果执行命令后,我只能得到foo=bar
字符串(这是我的用例),该怎么办?模拟此操作的最简单方法是使用简单的echo
命令。
➤ `echo foo=bar` env | grep foo
zsh: command not found: foo=bar
在此,zsh / bash开始将其解释为命令。我该如何解决?
答案 0 :(得分:3)
问题在于,外壳程序在进行扩展(包括命令替换(var1=val1 var2=val2 ... command
或`...`
)之前会先查找$(...)
形式。
解决此问题的一种方法是使用eval
使Shell在完成命令替换后进行解析:
eval "$(echo foo=bar)" env | grep foo
(有关为什么将`...`
更改为$(...)
的解释,请参见What is the benefit of using $() instead of backticks in shell scripts?。)
不幸的是,eval
具有潜在的危险。除非没有其他选择,否则不应使用它。参见Why should eval be avoided in Bash, and what should I use instead?。
另一种替代方法是在子shell中使用export
。一种方法是:
{ export "$(echo foo=bar)" ; env ; } | grep foo
由于export
是在管道中完成的(而不是管道的最后一部分,这对某些shell或某些模式会有所不同),因此它不会影响当前shell中的变量设置。如果该命令不在管道中,则有必要在子shell中显式运行它以获得相同的效果。例如
( export "$(echo foo=bar)" ; env ) > tmpfile
grep foo tmpfile
答案 1 :(得分:0)
它正在按预期工作。您是否尝试过以下方法?
env `echo foo=bar` | grep foo
答案 2 :(得分:0)
我不确定我是否理解您的问题,请尝试以下操作:
$ echo "hello" && foo=bar env | grep foo
hello
foo=bar