Não consigo entender o porquê
$ apt-cache policy foo
N: Unable to locate package foo
mas
$ apt-cache policy foo 2>&1 | grep .
está vazia.
Onde, na última chamada, estou fazendo a suposição errada?
A tarefa original: eu preciso processar a apt-cache policy
saída presumivelmente :-)
UPD :
foo
usado no meu exemplo pode ser substituído por qualquer nome de pacote que não exista no seu apt-get
índice.
UPD 2 :
há uma resposta com uma solução alternativa. +50
Recompensa adicional será concedida a quem explicar por que a 2>&1
solução não funciona.
# 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
e há uma chamada do sistemaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
, acho que por causa dessa chamada 1 (stdout) tem problemas. Quero dizer que não é escrito para tty maisRespostas:
Se stdout não for um tty (ou seja, é um arquivo comum ou um canal) e se nenhuma
--quiet
opção foi especificada,apt-cache
age como se você a tivesse passado--quiet=1
. Uma solução alternativa é passar uma--quiet=0
opção para ela .fonte
|&
golfs2>&1 |
:-)Parece haver algum comportamento barato para redirecionamentos no
apt-cache
. Mas podemos enganar um trapaceiro trocando stdout e stderr !Experimente este, ele deve funcionar:
fonte
Se você executar o
strace apt-cache policy foo 2>&1
comando, poderá ver a linhaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Como esse comando manipula o 1 (stdout), 1 não é mais gravado no stdout. E se você redirecionar 2 para 1, você perdeu os dois.
Edit: Aqui está um exemplo de código do código-fonte do apt-cache:
fonte
apt-cache policy foo 1>&2 2>&1 | grep .
) Mas acho que no código fonte o apt apt-cache :) // Lida com o stdout não sendo um tty if (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("quiet", "1");script -c "sudo apt-cache policy foo" | grep Unable
que requer a instalação de umscript
arquivo. Conforme recomendado - colocarei +50 aqui em 2 dias (o SE não permite fazer isso antes)Uma solução "melhor" seria usar um
script
utilitário:Dessa forma, ele intercepta toda a saída e a encaminha para o
stdout
.A única desvantagem é que você precisa instalar o
script
se ainda não o tiver. No ubunty é fornecido pelobsdutils
pacote.fonte