Mengapa keluaran kebijakan apt-cache tidak disalurkan?

12

Tidak bisa mengerti mengapa

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

tapi

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

kosong.

Di mana dalam panggilan terakhir saya melakukan asumsi yang salah?

Tugas asli: Saya perlu memproses apt-cache policyoutput mungkin :-)

UPD :

foodigunakan dalam contoh saya dapat diganti dengan nama paket apa pun yang tidak ada dalam apt-getindeks Anda .

UPD 2 :

ada jawaban dengan solusinya. +50Karunia tambahan akan diberikan kepada siapa saja yang menjelaskan mengapa 2>&1solusi tidak berhasil.

zerkms
sumber
# 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
PersianGulf
1
@MohsenPahlevanzadeh itu benar, sekarang coba panggilan yang tepat (nama paket) yang saya berikan :-)
zerkms
3
@MohsenPahlevanzadeh begitu? Maaf, tetapi apakah Anda yakin telah membaca pertanyaan (dan judulnya)?
zerkms
2
@MohsenPahlevanzadeh bukan itu tidak sama (bahkan tidak dekat)
zerkms
1
Saya menjalankan strace apt-cache policy foo 2>&1dan ada panggilan sistem ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0saya pikir karena panggilan ini 1 (stdout) memiliki masalah. Maksud saya itu tidak dituliskan ke tty lagi
Esref

Jawaban:

11

Jika stdout bukan tty (yaitu file biasa atau pipa) dan jika tidak ada --quietopsi yang ditentukan, apt-cachebertindak seolah-olah Anda telah melewatinya --quiet=1. Solusinya adalah memberikan --quiet=0opsi.

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo
Tandai Plotnick
sumber
|&golfs 2>&1 |:-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
10

Tampaknya ada beberapa perilaku curang untuk pengalihan di apt-cache. Tapi kita bisa menipu curang dengan bertukar stdout dan stderr !

Coba yang ini, seharusnya berhasil:

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

Jika Anda menjalankan strace apt-cache policy foo 2>&1perintah, Anda dapat melihat barisnyaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

Karena perintah itu memanipulasi 1 (stdout), 1 tidak ditulis ke stdout lagi. Dan jika Anda mengarahkan 2 ke 1, Anda kehilangan keduanya.

Sunting: Berikut adalah beberapa contoh kode dari kode sumber apt-cache:

// Deal with stdout not being a tty
   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
      _config->Set("quiet","1");
Esref
sumber
Baik. Adakah cara untuk menangkap keduanya?
zerkms
1
Saya tidak dapat menemukan cara lain selain seperti jawaban @ Mr_Mig. (Milik saya apt-cache policy foo 1>&2 2>&1 | grep .) Tapi saya menemukan bahwa dalam kode sumber apt apt-cache :) // Berurusan dengan stdout tidak menjadi tty if (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("quiet", "1");
Esref
Btw, saya juga ditunjukkan oleh seseorang ke titik yang sama dalam sumber hanya beberapa menit yang lalu :-) Dan solusi script -c "sudo apt-cache policy foo" | grep Unableyang berpotensi lebih baik yang memerlukan menginstal scriptmeskipun. Seperti yang disarankan - Saya akan meletakkan +50 di sini dalam 2 hari (SE tidak membiarkan melakukannya lebih awal)
zerkms
2
@Esref Komentar Anda tentang "Saya menemukan bahwa di kode sumber apt apt-cache ..." harus ada dalam jawaban, jadi silakan tambahkan di sana. +1. :
Faheem Mitha
Ya Tuhan, tidak ada opsi hadiah +50 lagi :-(
zerkms
3

Solusi "lebih baik" adalah menggunakan scriptutilitas:

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

Dengan cara itu memotong semua output dan meneruskannya ke stdout.

Satu-satunya kelemahan adalah bahwa Anda perlu menginstal scriptjika Anda belum memilikinya. Di mana-mana disediakan oleh bsdutilspaket.

zerkms
sumber