无法使用命令的输出分配环境变量

时间:2018-11-22 12:50:59

标签: bash zsh

我可以这样设置环境变量。

➤ foo=bar env | grep foo
foo=bar

但是,如果执行命令后,我只能得到foo=bar字符串(这是我的用例),该怎么办?模拟此操作的最简单方法是使用简单的echo命令。

➤ `echo foo=bar` env | grep foo
zsh: command not found: foo=bar

在此,zsh / bash开始将其解释为命令。我该如何解决?

3 个答案:

答案 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