Apt-cache policy output neden kullanılmıyor?


12

Neden alınamıyor

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

fakat

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

boş.

İkinci çağrıda nerede yanlış varsayım yapıyorum?

Orijinal görev: apt-cache policyÇıktı muhtemelen işlemek gerekiyor :-)

UPD :

fooörneğimde kullanılan , dizininizde bulunmayan herhangi bir paket adıyla değiştirilebilir apt-get.

UPD 2 :

geçici çözüm içeren bir yanıt var. Çözümün +50neden 2>&1çalışmadığını açıklayan herkese ek ödül verilecektir .


# 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 doğru, şimdi verdiğim tam aramayı (paket adı) deneyin :-)
zerkms

3
@MohsenPahlevanzadeh? Üzgünüm, ama soruyu (ve başlığı) okuduğunuzdan emin misiniz?
zerkms

2
@MohsenPahlevanzadeh eşit değil (hatta yakın değil)
zerkms

1
Ben koşmak strace apt-cache policy foo 2>&1ve ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0bu çağrı 1 (stdout) nedeniyle sorunları olduğunu düşünüyorum bir sistem çağrısı var. Demek istediğim artık tty'ye yazılmadı
Eşref

Yanıtlar:


11

Stdout bir tty değilse (yani normal bir dosya veya pipo ise) ve herhangi bir --quietseçenek belirtilmemişse, apt-cachegeçmişmişsiniz gibi davranır --quiet=1. Çözüm, bir --quiet=0seçeneği iletmektir.

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


10

İçindeki yönlendirmeler için bazı ucuz davranışlar var gibi görünüyor apt-cache. Ama stdout ve stderr'i değiştirerek bir hile yapabiliriz !

Bunu deneyin, işe yaramalı:

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

7

strace apt-cache policy foo 2>&1Komutu çalıştırırsanız , satırı görebilirsinizioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

Bu komut 1'i (stdout) değiştirdiğinden, 1 artık stdout'a yazılmaz. Eğer 2'ye 1 yönlendirirseniz, ikisini de kaybettiniz.

Düzenleme: İşte apt-cache kaynak kodundan bazı kod örneği:

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

Tamam. İkisini de yakalamanın bir yolu var mı?
zerkms

1
@ Mr_Mig'in cevabı gibi başka bir yol bulamadım. (Benim oldu apt-cache policy foo 1>&2 2>&1 | grep .) Ama apt-cache kaynak kodunda :) // stdout ile başa çıkmak eğer tty olmak değil (! İsatty (STDOUT_FILENO) && _config-> FindI ("sessiz", -1) == - 1) _config-> Ayarla ("sessiz", "1");
Eşref

Btw, ben de sadece birkaç dakika önce kaynaklarda aynı noktaya işaret etti :-) Ve bir script -c "sudo apt-cache policy foo" | grep Unableyüklemeyi gerektiren potansiyel olarak daha iyi bir çözüm script.
Önerildiği

2
@Esref "Kaynak kodda uygun apt-cache ..." ile ilgili yorumunuz yanıtında olmalı, lütfen oraya ekleyin. +1. :
Faheem Mitha

Tanrım, artık +50 ödül seçeneği yok :-(
zerkms

3

"Daha iyi" bir çözüm bir scriptyardımcı program kullanmak olacaktır :

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

Bu şekilde tüm çıktıları keser ve 'e iletir stdout.

Tek dezavantajı, scripthenüz sahip değilseniz yüklemeniz gerekir . Ubunty'de bsdutilspaket tarafından sağlanır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.