Nie mogę zrozumieć dlaczego
$ apt-cache policy foo
N: Unable to locate package foo
ale
$ apt-cache policy foo 2>&1 | grep .
jest pusty.
Gdzie w tym drugim wezwaniu robię błędne założenie?
Oryginalne zadanie: apt-cache policy
prawdopodobnie przetwarzam dane wyjściowe :-)
UPD :
foo
użyte w moim przykładzie można zastąpić dowolną nazwą pakietu, która nie istnieje w twoim apt-get
indeksie.
UPD 2 :
istnieje odpowiedź z obejściem. Dodatkowa +50
nagroda zostanie przyznana każdemu, kto wyjaśni, dlaczego 2>&1
rozwiązanie nie działa.
# 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
i jest wywołanie systemowe,ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
które myślę, że z powodu tego połączenia 1 (standardowe wyjście) ma problemy. Mam na myśli, że nie jest już napisany do ttyOdpowiedzi:
Jeśli stdout nie jest tty (tzn. Jest zwykłym plikiem lub potokiem) i jeśli nie
--quiet
określono żadnej opcji,apt-cache
działa tak, jakbyś ją przeszedł--quiet=1
. Obejściem jest podanie--quiet=0
opcji.źródło
|&
golfa2>&1 |
:-)Wygląda na to, że istnieją pewne oszukańcze zachowania dotyczące przekierowań w
apt-cache
. Ale możemy oszukiwać oszusta, zamieniając stdout i stderr !Wypróbuj ten, powinien działać:
źródło
Jeśli uruchomisz
strace apt-cache policy foo 2>&1
polecenie, zobaczysz linięioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Ponieważ to polecenie manipuluje 1 (standardowe wyjście), 1 nie jest już zapisywane w standardowe wyjście. A jeśli przekierujesz 2 na 1, stracisz oba.
Edycja: Oto przykładowy kod z kodu źródłowego apt-cache:
źródło
apt-cache policy foo 1>&2 2>&1 | grep .
) Ale znajduję to w kodzie źródłowym apt apt-cache :) // Zajmij się tym, że stdout nie jest tty, jeśli (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set („quiet”, „1”);script -c "sudo apt-cache policy foo" | grep Unable
które wymaga instalacjiscript
. Zgodnie z zaleceniem - umieszczę tutaj +50 za 2 dni (SE nie pozwala na to wcześniej)„Lepszym” rozwiązaniem byłoby użycie
script
narzędzia:W ten sposób przechwytuje wszystkie dane wyjściowe i przekazuje je do
stdout
.Jedyną wadą jest to, że musisz zainstalować,
script
jeśli jeszcze go nie masz. W Ubunty jest dostarczany przezbsdutils
pakiet.źródło