Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么';这个bash代码不能工作吗?_Linux_Bash_Shell_Subshell - Fatal编程技术网

Linux 为什么';这个bash代码不能工作吗?

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中运行,并将其值返回给被调用方。。同样的

我希望第二行生成“a=b”,并在主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