ユーザー入力を必要とするコマンドでxargsを使用する方法は?

ユーザー入力を必要とするコマンドでxargsを使用する方法は?

以下を使用して、インストールするパッケージの名前を返すパイプを設定しました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があります)。

おすすめ記事