12

make からの非常に長い出力をフィルタリングして特定の警告またはエラー メッセージを取得しようとする場合、最初のアイデアは次のようになります。

$ make | grep -i 'warning: someone set up us the bomb'

ただし、結果は完全に満足できるものではありません。出力には、フィルター結果だけでなく、ターゲットのどこかで使用されている他のツールからのメッセージもgrep含まれます。stdoutstderrmake

問題は次のとおりです。

  1. 他の出力はどこから来るのですか?
  2. 出力にフィルタリングされた行のみが含まれるフィルターコマンドを作成する方法は?
4

3 に答える 3

12

質問に答えるには:

  1. パイプは of を grep に接続するstdoutだけmakeですstdinmakeはまだ端末に接続されているstderrため、フィルタリングせずに出力されます。
  2. 解決策は、 をそれに接続し、を無視することですmakestderrstdinstdin

    $ make 2>&1 >/dev/null | grep -i 'warning: someone set up us the bomb'
    

これは grep の出力のみを表示しますが、make や のような他のツールからの出力は表示しませんrm

于 2013-09-20T10:18:17.517 に答える
1

stderr を除外します。

make 2>/dev/null | grep -i 'warning: someone set up us the bomb'

$ ls
hello
$ ls hello bye
ls: cannot access bye: No such file or directory # <--- this is stderr
hello
$ ls hello bye 2>/dev/null # <--- stderr are sent to /dev/null, so don't appear
hello

コメントに見られるように、すべてのmake出力は stderr として与えられるため、最初のソリューションは何にも一致しません。したがって、私の提案は以下を使用することです。

make 2> >(tee make_output.log >&2)

そして、make_output.log. パイプで「tee」を使用しているときにstderrをファイルに書き込むにはどうすればよいですか?.

$ ls aaa
ls: cannot access aaa: No such file or directory
$ ls aaa 2> >(tee stderr.log >&2)
ls: cannot access aaa: No such file or directory
$ cat stderr.log 
ls: cannot access aaa: No such file or directory
于 2013-09-18T13:44:56.200 に答える