Pipe

如何將 xargs 與需要使用者輸入的命令一起使用?

  • February 9, 2018

我設置了一個管道,返回我想安裝的包的名稱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

包名不應該有任何空格,所以使用$packagesunquoted 應該可以工作(假設預設值$IFS; 他們可能也不能包含 glob 字元,所以set -f可能是不必要的)。

引用自:https://unix.stackexchange.com/questions/422826