grep 输出时管道损坏,但仅限使用 -i 标志

grep 输出时管道损坏,但仅限使用 -i 标志

我试图通过 grep 的输出来查看是否安装了某个 python 库pip list。如果我尝试这个

pip list | grep -q $package,效果很好。如果我尝试pip list | grep -qi $package,我会得到以下错误输出

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

这似乎是 python 方面的一个错误,忽略大小写的 grem 标志与 pip 通过管道发送信息的能力有什么关系?

这是在运行 Raspberry Pi 3pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)grep (GNU grep) 2.20.

答案1

使用该-q标志,grep当第一行数据匹配时,程序将立即停止。

但是pip可能仍在尝试将数据发送到管道中。它将收到一个 SIGPIPE。这会导致错误回溯。

使用该-i标志,进程可能会在完成写出结果grep之前更快地停止(较早的匹配) 。pip

-q通常,除非您确定另一端的程序可以处理 SIGPIPE,否则您不应该在这样的管道中使用。

所以pip list | grep -i $packagename会正常工作。

相关内容