
以下を使用して、インストールするパッケージの名前を返すパイプを設定しましたapt-get
。
... | xargs -I _ sudo apt install _
ただしapt-get
、この場合、標準入力から読み取って終了する方法はありません。
続行しますか? [Y/N] 中断します。
ユーザーを確認せずにパッケージをインストールするフラグがあることを知っていますが、-y
実際に確認を見たいです。
apt-get
標準入力から読み取ることを許可しながら、パッケージ名をに渡す方法はありますか?
apt-get
コマンド全体の左側に配置することはオプションではありませんapt-get
。これは、パイプラインで以前のコマンドを中断するために使用される場合、コマンドを実行したくないためですset -o pipefail
。
答え1
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
なしで使用すると機能します(デフォルトを想定する$IFS
とグローバル文字も含めることができないため、不要になる可能性set -f
があります)。
答え2
GNU実装xargs
(通常はapt
コマンドもあるシステムで見つかります)とプロセスの置き換えをサポートするksh93 / zsh / bashなどのシェルを使用すると、次のことができます。
sudo xargs -I _ -ra <(cmd) apt install _
変える:
cmd | xargs -I _ sudo apt install _
パッケージごとに1つのパッケージを呼び出すapt
よりも、すべてのパッケージを一度に渡す方が合理的です。apt
sudo xargs -d '\n' -ra <(cmd) apt install
(-d
もう一つのGNU拡張です)
いずれにせよ、パイプラインバージョンと同様に、pipefail
どちらも成功したかどうかにかかわらず実行されます。なぜなら、とが同時に開始され、同時に実行されるからです。sudo
cmd
sudo
cmd