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 policy
output mungkin :-)
UPD :
foo
digunakan dalam contoh saya dapat diganti dengan nama paket apa pun yang tidak ada dalam apt-get
indeks Anda .
UPD 2 :
ada jawaban dengan solusinya. +50
Karunia tambahan akan diberikan kepada siapa saja yang menjelaskan mengapa 2>&1
solusi tidak berhasil.
# 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
strace apt-cache policy foo 2>&1
dan ada panggilan sistemioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
saya pikir karena panggilan ini 1 (stdout) memiliki masalah. Maksud saya itu tidak dituliskan ke tty lagiJawaban:
Jika stdout bukan tty (yaitu file biasa atau pipa) dan jika tidak ada
--quiet
opsi yang ditentukan,apt-cache
bertindak seolah-olah Anda telah melewatinya--quiet=1
. Solusinya adalah memberikan--quiet=0
opsi.sumber
|&
golfs2>&1 |
:-)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:
sumber
Jika Anda menjalankan
strace apt-cache policy foo 2>&1
perintah, 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:
sumber
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");script -c "sudo apt-cache policy foo" | grep Unable
yang berpotensi lebih baik yang memerlukan menginstalscript
meskipun. Seperti yang disarankan - Saya akan meletakkan +50 di sini dalam 2 hari (SE tidak membiarkan melakukannya lebih awal)Solusi "lebih baik" adalah menggunakan
script
utilitas:Dengan cara itu memotong semua output dan meneruskannya ke
stdout
.Satu-satunya kelemahan adalah bahwa Anda perlu menginstal
script
jika Anda belum memilikinya. Di mana-mana disediakan olehbsdutils
paket.sumber