`;` 和 `&&` 和 `|` 之間有差別嗎?

`;` 和 `&&` 和 `|` 之間有差別嗎?

當您想要執行多個命令時,可以使用;,&&|

像這樣:killall Finder; killall SystemUIServercd ~/Desktop/ && rm Caches或:man grep | man cat例如。

|但是,;和之間有差別嗎&&?如果是這樣,有什麼區別?

答案1

  • ;:以a分隔的命令; 依序執行。 shell 依序等待每個指令終止。

  • &&:當且僅當 command before返回退出狀態為零&&時,才執行command after。&&您可以將其視為AND運算符。

  • |: 管道。在表達式中,command1 | command2command1 的標準輸出透過管道連接到command2 的標準輸入。

還有更多類似的控制運算符,值得一提:

  • ||:當且僅當 command before返回非零退出狀態時,||才執行command after。||您可以將其視為OR運算符。請注意,那|||是完全不同的動物。

  • &:shell&在背景執行由 終止的命令,不等待命令完成並立即返回退出代碼 0 再次&與 無關&&

  • |&2>&1 |:即command1的標準輸出和標準錯誤都透過管道連接到command2的標準輸入的簡寫。

此外,如果您使用zshthen 您也可以使用&|或啟動命令&!。在這種情況下,作業立即被拒絕,啟動後它在作業表中沒有位置。

答案2

考慮兩個命令AB。當你寫的時候

A | B

AB並行執行,並且 的標準輸出A作為 的標準輸入發送B

當你寫的時候

A; B

A被執行,然後B被執行(除非set -e已被使用並A以非零退出狀態終止,在這種情況下,shell 在 後立即終止A)。

當你寫的時候

A && B

A被執行,然後僅在成功終止(零退出狀態)B時執行。A這種形式比前一種形式更安全,例如

cd some_dir && rm file*

確保&&刪除正確的文件,即僅在cd成功時才刪除文件。

答案3

其他答案已經解釋了|,&&;,所以我將添加一些您沒有明確要求的額外內容:||

A || B

A被執行,然後僅在失敗B時執行。A這對於對錯誤情況做出反應很有用:

martin@martin ~ % rm doesnotexist 2>/dev/null || echo "failed to delete file"
failed to delete file

2>/dev/null有必要隱藏rm其自身的錯誤訊息。)

答案4

鑑於您的實際示例,似乎沒有人解釋您為什麼要使用每一個。我會嘗試:

killall Finder; killall SystemUIServer

像這樣的命令killall可能需要一些時間才能執行。透過使用分號,您可以同時發出兩個命令,然後在等待時執行其他操作。這樣您就不必等待兩次(每個命令一次)。

cd ~/Desktop/ && rm Caches

您想要刪除該目錄~/Desktop/Caches並最終進入該目錄~/Desktop。您不想做的是從目前目錄中刪除目錄 Caches(在更改它之前)。因此&&,在執行刪除命令之前, 您需要檢查目錄變更是否成功。

man grep | man cat

這對我來說毫無意義。此man命令不處理輸入,因此透過管道傳遞給它不會執行任何操作。也許你的意思是

man grep || man cat

它會嘗試尋找 的手冊頁grep,如果找不到,則會顯示 的手冊頁cat。或者可能你的意思是

man grep | cat

這將用於cat顯示手冊頁而不是尋呼機(通常less)。將|輸出重定向man到命令cat(將所有內容轉儲到螢幕)。這在 GUI 中很有用,您可以使用滾動條在檔案中來回移動,而不是在 less 中使用鍵盤命令。

注意:如果您想知道; && | ||在更一般的情況下該怎麼做,那麼我建議查看 jimmij 的答案。我只是想解釋問​​題示例中發生的情況。

相關內容