Tubulação quebrada quando a saída do grepping, mas apenas com a opção -i

3

Estou tentando verificar se uma determinada biblioteca python está instalada, exibindo a saída de pip list . Se eu tentar isso

pip list | grep -q $package , funciona bem. Se eu tentar pip list | grep -qi $package , recebo a seguinte saída de erro

pi@pibox:~ $ pip list | grep -i -q pyyaml
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
  File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 248, in main
    return command.main(cmd_args)
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 156, in main
    logger.fatal('Exception:\n%s' % format_exc())
  File "/usr/lib/python2.7/dist-packages/pip/log.py", line 111, in fatal
    self.log(self.FATAL, msg, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/pip/log.py", line 164, in log
    consumer.flush()
IOError: [Errno 32] Broken pipe

isso parece ser um erro no lado python das coisas, o que a flag grepm para ignorar caso tem a ver com a habilidade do pip de enviar informações para um pipe?

Isso está em um Raspberry Pi 3 executando pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7) e grep (GNU grep) 2.20 .

    
por John Allard 24.08.2016 / 23:09

1 resposta

5

Com o sinal -q , o programa grep parará imediatamente quando a primeira linha de dados corresponder.

No entanto, pip ainda pode estar tentando enviar dados para o pipe. Ele receberá um SIGPIPE. E isso faz com que o erro seja traceback.

Com o sinal -i , é possível que o processo grep seja interrompido mais cedo (correspondência anterior), antes que pip tenha terminado de escrever os resultados.

Normalmente, você não deve usar -q em um pipeline como este, a menos que tenha certeza de que o programa na outra ponta possa manipular o SIGPIPE.

Portanto, pip list | grep -i $packagename funcionará sem erros.

    
por 24.08.2016 / 23:15