apt-cacheポリシー出力がパイプされないのはなぜですか?

apt-cacheポリシー出力がパイプされないのはなぜですか?

なぜかわかりません。

$ apt-cache policy foo
N: Unable to locate package foo

しかし、

$ apt-cache policy foo 2>&1 | grep .

空いた。

後者の呼び出しで、私はどこで間違った仮定をしましたか?

apt-cache policy最初のタスク:おそらく出力を処理する必要があるようです :-)

UPD:

foo私の例で使用されているパッケージ名は、他のパッケージ名に置き換えることができます。存在しないあなたの索引にapt-get

アップデート2:

答えと解決策があります。このソリューションがうまくいかない理由を説明できる人は誰でも追加の+50賞金を受け取ります。2>&1

答え1

stdoutがttyではなく(つまり、通常のファイルまたはパイプ)--quietオプションが指定されていないapt-cache場合は、それを渡したかのように処理されます--quiet=1。解決策はオプションを渡すことです--quiet=0

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo

答え2

のリダイレクトに一部不正行為があるようですapt-cache。しかし、私たちは詐欺師をだますことができます。stdoutとstderrを交換してください

これを試してみてください。動作します。

apt-cache policy foo 3>&1 1>&2 2>&3 3>&- | grep .

答え3

コマンドを実行すると、strace apt-cache policy foo 2>&1次の行が表示されます。ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

このコマンドは1(stdout)で動作するため、1はstdoutに書き込まれなくなりました。 2を1にリダイレクトすると、そのエントリが失われます。

編集:以下はapt-cacheソースコードのいくつかのコード例です。

// Deal with stdout not being a tty
   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
      _config->Set("quiet","1");

答え4

「より良い」ソリューションはscriptユーティリティを使用することです。

script -c "apt-cache policy foo" /dev/null | grep .

このようにしてすべての出力を傍受しますstdout

script唯一の欠点は、まだインストールしていない場合はインストールする必要があることです。 Ubuntiではbsdutilsパッケージとして提供されます。

関連情報