web-dev-qa-db-ja.com

パイプでavconvを出力する方法

出力をavconvからgrepにパイプしようとしていますが、どういうわけかパイプが正しく機能していません。次の方法は機能しません。

avconv -i MOVIE.mkv | grep SOMETHING-SOMETHINGを含むavconvの行のみを表示する必要があります。

avconv -i MOVIE.mkv pipe: | grep SOMETHING-SOMETHINGを含むavconvの行のみを表示する必要があります。

avconv -i MOVIE.mkv pipe:1 | grep SOMETHING-SOMETHINGを含むavconvの行のみを表示する必要があります。

情報をavconvからパイプに出力するにはどうすればよいですか?

なぜ機能しないのですか?

このようなパイプは機能しますが、-i情報パラメーターではありません:avconv -codecs | grep "264"

12.04および12.10でテスト済み

3
Luis Alvarado

私はFormat Junkieの開発者の1人なので、avconvがどのように機能するかを知っています。すべての重要なデータをstderrに送信することを保証します。したがって、stderrからgrepする必要があります。実際には、すべてのstderrをstdoutにリダイレクトしてからgrepを実行します。

例えば:

avconv -i 111.avi 2>&1 | grep Duration

正しく出力:

  Duration: 00:01:05.02, start: 0.000000, bitrate: 2910 kb/s

Grepがavconvの出力の一部でのみ機能する理由は、この特定の出力がstderrではなくstdoutに与えられているため、grepに正常にパイプされるためです。

通常、stderrはエラーメッセージを出力するために使用され、stdoutは通常の情報メッセージを出力するために使用されます。

必要に応じて出力をフィルタリングできるため、stderrとstdoutの両方が存在することは悪くありません。たとえば、次のことを考慮してください。

command > log.txt 2> error_log.txt

これにより、すべての通常出力(stdout)がlog.txtに、すべてのエラー(stderr)がerror_log.txtに出力されます。

ただし、avconvがstderrを使用してメッセージを表示する理由はわかりません。

6
hytromo