
なぜかわかりません。
$ 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
パッケージとして提供されます。