Linux 为什么';这个bash代码不能工作吗?
我希望第二行生成“a=b”,并在主shell的上下文中执行它,从而生成一个值为Linux 为什么';这个bash代码不能工作吗?,linux,bash,shell,subshell,Linux,Bash,Shell,Subshell,我希望第二行生成“a=b”,并在主shell的上下文中执行它,从而生成一个值为b的新变量a。 但是,我真正得到的(如果我手动输入命令)是第二行之后的错误消息,bash:a=b:command not found 为什么会这样?你有没有试过在那个有趣的撇号中使用$x?如果没有echo,echo似乎只用于显示字符串,而不是执行命令。试试看 x="a=b" `echo $x` echo $a (我们需要30个字符才能发布此答案)您的第一条回显线路在子shell中运行,并将其值返回给被调用方。。同样的
b
的新变量a
。
但是,我真正得到的(如果我手动输入命令)是第二行之后的错误消息,bash:a=b:command not found
为什么会这样?你有没有试过在那个有趣的撇号中使用
$x
?如果没有echo,echo似乎只用于显示字符串,而不是执行命令。试试看
x="a=b"
`echo $x`
echo $a
(我们需要30个字符才能发布此答案)您的第一条回显线路在子shell中运行,并将其值返回给被调用方。。同样的结果是使用
$()
实现的,顺便说一句,它比backticks更容易使用
因此,您要做的是首先运行echo$x
(返回a=b
)。而且,由于反勾号的存在,a=b
被返回到shell,该shell尝试将该行作为命令运行,但显然,该命令不起作用
在shell中尝试以下操作:
$(echo ls)
您将清楚地看到发生了什么。这是因为bash解析命令行的顺序。在执行变量和命令替换(例如反勾号中的命令)之前,它会查找变量定义(例如
a=b
)。因此,当echo$x
被a=b
替换时,bash将其视为变量定义并将其解析为命令已经太迟了。如果只使用$x
作为命令(而不是backticks中的echo),同样的情况也会发生。在@mvds的回答中,可以使用eval
命令强制从一开始就重新解析该命令,这意味着它将被识别为变量定义:
eval $x
请注意,在使用
eval
时,我将所有对$x
的引用都放在双引号中——这是为了防止bash解析的后续阶段(例如分词)发生两次,因为bash将完成其常规解析过程,然后识别eval
命令,然后重新执行整个解析过程。使用eval
很容易得到意想不到的结果,这至少消除了一些潜在的问题。它们被称为backticks(在这种情况下,$x
和echo$x
都会产生相同的结果)。这帮助我解决了一个相关问题。。。我正在执行一个带有反勾号的shell脚本,该脚本回显“hi”。我没有将stdout捕获到被调用方的变量中,因此被调用方尝试执行./hi和./hi不存在。。。
$ x="a=b"
$ `echo $x`
-bash: a=b: command not found
$ $(echo $x) # Exact same thing, but with cleaner syntax
-bash: a=b: command not found
$ $x # This also does the same thing, but without some extra steps
-bash: a=b: command not found
$ eval "$x" # This will actually work
$ echo $a
b
$ a= # Start over
$ eval "$(echo "$x")" # Another way of doing the same thing, with extra steps
$ echo $a
b