Pipe
如何將 xargs 與需要使用者輸入的命令一起使用?
我設置了一個管道,返回我想安裝的包的名稱
apt-get
:... | xargs -I _ sudo apt install _
但是,
apt-get
在這種情況下無法從標準輸入讀取並退出:你要繼續嗎?
$$ Y/n $$中止。
我知道在
-y
沒有使用者確認的情況下安裝包的標誌,但我想真正看到確認。有沒有辦法將包名轉發到
apt-get
同時仍然允許它從標準輸入讀取?放在整個命令的左側不是一個選項,因為如果使用該選項中止管道中的 ealier 命令,
apt-get
我不想被執行。apt-get``set -o pipefail
pipefail
不會阻止管道的右側執行,整個管道像往常一樣同時執行。試試例如$ set -o pipefail $ false | echo foo foo
如果沒有輸入,它的使用
xargs
可能會或可能不會阻止在這裡執行。apt
沒有-r
或-I
它仍然會至少執行一次命令。但是您可以通過使用命令替換擷取輸出然後
apt
根據結果執行或不執行來解決此問題:if packages=$(somecmd...) && [ "$packages" ] ; then set -f sudo apt install $packages fi
包名不應該有任何空格,所以使用
$packages
unquoted 應該可以工作(假設預設值$IFS
; 他們可能也不能包含 glob 字元,所以set -f
可能是不必要的)。