2014-11-06 62 views
5
[email protected]:~$ test -x examples.desktop && echo $? 
[email protected]:~$ test -x examples.desktop & echo $? 
[1] 2992 
0 

bash为什么在这种情况下采取行动?测试命令是否完成并因此不处理回显命令?&& vs&带有bash中的测试命令

+1

你确实不解释你期望的行为。这件事令人惊讶呢?为什么会令人惊讶?它与什么期望相矛盾? – 2014-11-06 03:58:36

回答

6

&&&的含义在本质上是不同的。

  • 什么是&&bashbash和其他许多编程语言中,&&表示“AND”。在这样的命令执行上下文中,这意味着在这种情况下应该按顺序运行&&左侧和右侧的项。
  • 什么是&bash而单个&意味着前面的命令(即&的左侧)只能在后台运行。

所以在看你的例子:

[email protected]:~$ test -x examples.desktop && echo $? 
[email protected]:~$ test -x examples.desktop & echo $? 
[1] 2992 
0 

的第一个命令,因为它的结构,实际上不返回任何东西。但是第二个命令返回一个[1] 2992,其中2992是指在后台运行的进程ID(PID),而0是第一个命令的输出。

由于第二个命令在后台刚刚运行test -x examples.desktop,它发生得非常快,所以进程标识生成并立即变得相当漂亮。

2

&在后台执行一个命令,并且不管状态如何都会返回0。

the man page

如果一个命令是由操作者控制终止&,壳中在子shell后台执行该命令。 shell不会等待命令完成,并且返回状态为0.由a分隔的命令;按顺序执行; shell等待每个命令依次终止。返回状态是执行的最后一个命令的退出状态。

2

看看你的命令是什么:

$ test -x examples.desktop && echo $? 

这意味着检查,看是否examples.desktop是可执行的,如果是则执行echo $?

$ test -x examples.desktop & echo $? 

手段检查,看看是否examples.desktop是可执行文件并在“后台”中运行,然后执行echo $?