Por que a saída da política do apt-cache não é canalizada?

12

Não é possível entender por que

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

mas

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

está vazio.

Onde no último telefone estou fazendo a suposição errada?

A tarefa original: Eu preciso processar a saída apt-cache policy presumivelmente: -)

UPD :

foo usado no meu exemplo pode ser substituído por qualquer nome de pacote que não exista no seu apt-get index.

UPD 2 :

há uma resposta com uma solução alternativa. Recompensa +50 adicional será concedida a qualquer pessoa que explique por que a solução 2>&1 não funciona.

    
por zerkms 06.05.2015 / 22:46

4 respostas

11

Se stdout não for um tty (ou seja, um arquivo regular ou um pipe) e se nenhuma opção --quiet tiver sido especificada, apt-cache age como se você tivesse passado --quiet=1 . Uma solução alternativa é passar uma opção --quiet=0 .

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo
    
por 07.05.2015 / 17:23
10

Parece haver um comportamento inadequado para redirecionamentos em apt-cache . Mas podemos trapacear um trapaceiro trocando stdout e stderr!

Tente este aqui, deve funcionar:

apt-cache policy foo 3>&1 1>&2 2>&3 3>&- | grep .
    
por 06.05.2015 / 23:49
7

Se você executar o comando strace apt-cache policy foo 2>&1 , poderá ver a linha ioctl(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:

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

Uma solução "melhor" seria usar um utilitário script :

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

Dessa forma, ele intercepta toda a saída e encaminha para o stdout .

O único inconveniente é que você precisa instalar o script se ainda não o tiver. No ubunty ele é fornecido por bsdutils package.

    
por 07.05.2015 / 03:47

Tags