
在 shell 腳本中並行運行命令通常非常有幫助,但我找不到方法來做到這一點。這可能嗎?如果是這樣,我將如何實現這一目標?我主要感興趣的是為fish
.
當我運行需要很長時間才能完成但可以或需要同時運行以減少完成所有操作所需的時間的命令時,它非常有用。
答案1
最基本的方法是&
,這個另一個答案是對的。它還提倡nohup
但nohup
重定向 stdin、stdout 和 stderr,您可能想要也可能不想要。讀nohup
和disown
之間的區別&
並做出明智的決定。
另一種方法是parallel
。如果您想要並行化的命令是彼此相似你可以製作一個圖案。
該工具的基本變體(moreutils
至少來自在 Debian 中)允許您限制同時執行的作業數量。GNUparallel
是比較先進的。如果您想要執行的作業產生輸出,那麼以下選項將特別有用:
--group
團體輸出。每個作業的輸出都分組在一起,並且僅在命令完成時才列印。首先是 Stdout(標準輸出),然後是 stderr(標準誤差)。 […]
(來源)
(--group
預設情況下啟用,因此通常不需要明確使用它。)
--keep-order
-k
保持輸出順序與輸入順序相同。通常,作業完成後就會立即列印作業的輸出。 [...]-k
只影響列印輸出的順序,而不影響作業運作的順序。
(來源)
有了它們,多個作業的輸出將被組織起來,這是你無法從中獲得的&
。有時你可能不關心輸出但仍然關心順序;像我的這個答案其中 GNUparallel
用於並行化多個curl
進程並獲取每個進程的退出狀態,並保留順序。
在 Debian 中,GNUparallel
位於名為parallel
.作為一個單獨的可執行檔parallel
可以從任何 shell 運行。