
當您想要執行多個命令時,可以使用;
,&&
和|
像這樣:killall Finder; killall SystemUIServer
,cd ~/Desktop/ && rm Caches
或:man grep | man cat
例如。
|
但是,;
和之間有差別嗎&&
?如果是這樣,有什麼區別?
答案1
;
:以a分隔的命令;
依序執行。 shell 依序等待每個指令終止。&&
:當且僅當 command before返回退出狀態為零&&
時,才執行command after。&&
您可以將其視為AND
運算符。|
: 管道。在表達式中,command1 | command2
command1 的標準輸出透過管道連接到command2 的標準輸入。
還有更多類似的控制運算符,值得一提:
||
:當且僅當 command before返回非零退出狀態時,||
才執行command after。||
您可以將其視為OR
運算符。請注意,那|
和||
是完全不同的動物。&
:shell&
在背景執行由 終止的命令,不等待命令完成並立即返回退出代碼 0 再次&
與 無關&&
。|&
2>&1 |
:即command1的標準輸出和標準錯誤都透過管道連接到command2的標準輸入的簡寫。
此外,如果您使用zsh
then 您也可以使用&|
或啟動命令&!
。在這種情況下,作業立即被拒絕,啟動後它在作業表中沒有位置。
答案2
考慮兩個命令A
和B
。當你寫的時候
A | B
A
和B
並行執行,並且 的標準輸出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 的答案。我只是想解釋問題示例中發生的情況。