grep出力でパイプが壊れているが-iフラグのみを使用する

grep出力でパイプが壊れているが-iフラグのみを使用する

特定のPythonライブラリがインストールされていることを確認するために出力をgrepしようとしています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それはうまくいくでしょう。

関連情報