xargsがapt-getを中止させるのはなぜですか?


17

ファイルからパッケージのリストを削除しようとしています。私は次のコマンドを使用しています:

cat packages | xargs sudo apt-get remove

packages削除したいパッケージのリストを含むファイルです。すべてが機能しているように見えapt-getますが、「はい」または「いいえ」を選択させる代わりに中断します。

私は-yオプションでこれを回避できることを知っていますが、なぜこれが起こっているのか、どのようにインタラクティブな選択を保つことができるのか知りたいです。


まったく機能しないように聞こえる場合、どのように「うまく機能」しますか?ファイルのエントリはどのように見えますか?試しましたsudo xargs --arg-file packages apt-get removeか?
追って通知があるまで一時停止します。

apt-getは適切なパッケージを削除するポイントに到達するため、それは一種の「動作」です。つまり、-arg-fileは私が探していたものです。あなたはそれを答えに入れることができ、私はそれを受け入れます。ありがとう!
subb

回答:


13
xargs -a packages sudo apt-get remove

は、xargsから引数を読み取るように指示するpackagesため、標準入力が損なわれないままになります。


10

より一般的な解決策は

 sudo apt-get remove `cat packages`

パッケージのリストが本当に長い場合に問題が発生します

動作しないのは、apt-getが-パイプのため-に接続されている標準入力から確認を読み取ろうとしているためcatです。逆に、sudo/ dev / ttyを直接開いてパスワードを要求することにより、正しいことを行います。Aptはこれを行うべきですが、明らかにそうではありません。


xargsの標準入力はからのパイプに接続されてcatいますが、xargsによって開始されたプロセスの標準入力は/ dev / nullから来ています。これはxargsの動作です。簡単なデモンストレーション:echo "" | xargs ls -l /dev/self/fd
ジュリアーノ

1
@mws:いいえ、apt-get開いてはいけません/dev/tty。そうしないと、次のようなことができませんでしたyes | apt-get。パスワードは、読む/dev/ttyことが正しいことである唯一のケースであり、それだけでも議論の余地があります。
ジル「SO-悪であるのをやめる」

コメントのおかげで、両方とも私の平手打ちの応答よりも正しく、よく考えられています。コメントがまだ意味をなさないように、編集されないままにしておきます。
-msw

そうですか。ephemientが示唆しているように、これとxargs -aファイル名に違いはありますか?
subb

はい、ephimemientの--arg-fileオプションの使用は特定の場合により良いため、私はそれを支持しました。そのようなオプションを持たない多くのコマンドでは、backtick-catのメタファーにはまだ使用方法があります。
msw

2

そのためapt-get、複数のパッケージを削除されているため、操作を確認しなければなりません。STDINパイプからの読み取りであり、端末に接続されていないため、autoと見なされNoます。

これを回避する別の方法は、に追加するAPT::Get::Assume-Yesことapt.confです。


2

どうやらxargsはSTDINをリダイレクトし、apt-getが非対話モードで実行されていると仮定するのを混乱させます。

私はおそらく次のようなものを使用します

sudo apt-get remove $(cat packages)

xargsをまったく使用しないようにします。

( "--arg-file"はapt-get(8)manにも私のアクティブなボキャブラリーにもありません)。


1

回避する。

GNU xargsおよびksh / zsh / bashの場合:

sudo xargs -r --arg-file <(cat packages) apt-get remove

コマンドがちょうどであれば(もちろん、cat場合、あなたは置き換えることができ<(cat packages)packages

または:

< packages sudo xargs sh -c 'exec apt-get remove "$@" < /dev/tty' sh

「パッケージ」ファイルの形式に応じて(xargsは引数の空白で区切られたリストを想定し、引用符を処理します("'および\)を$(...)処理しますが、引用符を処理せず、グロビングパターンを展開します)、次のこともできます。

sudo apt-get remove $(cat packages)

ただし、多くのオペレーティングシステムではコマンドラインの長さに制限があるため、リストが大きい場合は機能しない可能性があることに注意してください(一方、 xargs複数のapt-getコマンドを実行することで問題を回避できます)。


0

私は間違っているかもしれませんが、これを試して、それが機能するかどうかを確認できます:

yes | sudo apt-get remove $(cat packages)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.