Я пытаюсь передать вывод из 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 в pipe?
Почему это не работает?
Трубопровод примерно так работает, но не информационный параметр -i
: avconv -codecs | grep "264"
Проверено 12.04 и 12.10
Я являюсь одним из разработчиков Format Junkie, так что я вроде знаю, как работает avconv, и уверяю вас, что он отправляет все важные данные в stderr. Итак, вам нужно grep из stderr. На самом деле, вы перенаправляете все 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 для отображения своих сообщений.