我正在尝试将 avconv 的输出通过管道传输到 grep,但不知何故管道无法正常工作。以下方法不起作用:
avconv -i MOVIE.mkv | grep SOMETHING
- 它应该只显示 avconv 中包含某些内容的行。
avconv -i MOVIE.mkv pipe: | grep SOMETHING
- 它应该只显示 avconv 中包含某些内容的行。
avconv -i MOVIE.mkv pipe:1 | grep SOMETHING
- 它应该只显示 avconv 中包含某些内容的行。
我如何将 avconv 的信息输出到管道?
为什么它不起作用?
管道传输类似这样的工作,但-i
信息参数却不行:avconv -codecs | grep "264"
在 12.04 和 12.10 上测试
答案1
我是 Format Junkie 的开发人员之一,所以我知道 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 的某些输出中起作用的原因是,此特定输出被提供给 stdout,而不是 stderr,因此它被成功传输到 grep。
通常使用 stderr 来输出错误消息,使用 stdout 来输出正常信息消息。
stderr 和 stdout 同时存在并不坏,因为您可以按照自己想要的方式过滤输出。例如,考虑以下内容:
command > log.txt 2> error_log.txt
这会将所有正常输出(stdout)输出到 log.txt,并将所有错误(stderr)输出到 error_log.txt
但我不知道为什么 avconv 专门使用 stderr 来显示其消息。