2014-11-06 60 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 $?