【发布时间】:2016-05-19 16:21:10
【问题描述】:
我在 bash 中发现了一些奇怪的东西,我无法理解它是如何工作的。
[test ~]$ a=""
[test ~]$ $a && echo 1
1
[test ~]$ $a
[test ~]$ echo $?
0
为什么 $a(为空)返回 0?它是否以某种方式转变为空命令?
如果我在&& 之前添加引号或写空字符串,它将返回错误。而空命令返回 0。
[test ~]$ "$a" && echo 1
-bash: : command not found
[test ~]$ "" && echo 1
-bash: : command not found
[test ~]$ `` && echo 1
1
那么,当我输入 $a 时会发生什么?
【问题讨论】:
-
这可能是
bash的解析器中的一个错误。"$a" && echo 1产生错误,因为空字符串不是有效命令。&& echo 1产生语法错误。$a && echo 1应该产生相同的语法错误,但似乎与 `: && echo 1 行为相同。 -
实际上,我猜解析器在
$a评估为空之前识别出两个由&&分隔的命令,此时它被视为空命令而不是解析错误。 -
...aside:变量不应该首先用于存储命令。请参阅 BashFAQ #50,mywiki.wooledge.org/BashFAQ/050
-
分号:
$a; echo hello和子shell( $a )和组{ $a; }也会发生同样的事情。