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


12

理由がわからない

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

だが

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

空です。

後者の呼び出しのどこで間違った仮定をしていますか?

元のタスク:apt-cache policyおそらく出力を処理する必要があります:-)

UPD

foo私の例で使用されているものは、インデックスに存在しないパッケージ名に置き換えることができますapt-get

UPD 2

回避策のある答えがあります。ソリューションが機能しない+50理由を説明した人には、追加の報奨金が授与され2>&1ます。


# apt-cache policy vim 2>&1 |grep . vim: Installed: 2:7.4.712-2 Candidate: 2:7.4.712-2 Version table: *** 2:7.4.712-2 0 500 http://ftp.debian.org/debian/ sid/main amd64 Packages 100 /var/lib/dpkg/status
ペルシャ湾

1
@MohsenPahlevanzadehそうです、今私が提供した正確な呼び出し(パッケージ名)を試してください:-)
zerkms

3
@MohsenPahlevanzadehそうですか?申し訳ありませんが、質問(およびタイトル)を読んだことがありますか?
zerkms

2
@MohsenPahlevanzadeh等しくない(近くさえない)
-zerkms

1
実行するstrace apt-cache policy foo 2>&1ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0、この呼び出し1(stdout)に問題があると思うシステムコールがあります。もうttyには書かれていません
Esref

回答:


11

stdoutがttyではない場合(つまり、通常のファイルまたはパイプである場合)、およびnoの場合 --quietオプションが指定されてい場合、apt-cache渡したかのように動作します--quiet=1。回避策は、--quiet=0オプションを渡すことです。

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


10

リダイレクトのためのいくつかの不正行為があるようです apt-cacheです。しかし、stdoutとstderrを交換することで詐欺師をだますことができます!

これを試してください、それは動作するはずです:

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

7

走ったら 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");

はい。両方をキャプチャする方法はありますか?
zerkms

1
@Mr_Migの答えのようなもの以外の方法は見つかりませんでした。(私はそうでしたapt-cache policy foo 1>&2 2>&1 | grep .)しかし、ソースコードでapt apt-cache :) // ttyではないstdoutを処理するif(!isatty(STDOUT_FILENO)&& _config-> FindI( "quiet"、-1)==- 1)_config-> Set( "quiet"、 "1");
Esref

ところで、私はまた、ほんの数分前にソースの同じポイントを誰かから指摘されました:-)そして、script -c "sudo apt-cache policy foo" | grep Unableインストールが必要な潜在的に優れたソリューションscript。アドバイスされているように-私はここに2日で+50を入れます(SEは早くそれをさせません)
-zerkms

2
@Esref「ソースコードでapt-apt ...を見つけた」というコメントが答えに含まれているはずなので、そこに追加してください。+1。:
ファヒームミタ

ああ、もう+50バウンティオプションはありません:-(
zerkms

3

「より良い」解決策は、scriptユーティリティを使用することです。

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

そのようにして、すべての出力をインターセプトして、に転送しstdoutます。

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

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