我试图通过 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
会正常工作。