Я использую ffmpeg, чтобы получить метаинформацию аудиоклипа. Но я не могу понять это.
$ ffmpeg -i 01-Daemon.mp3 |grep -i Duration
FFmpeg version SVN-r15261, Copyright (c) 2000-2008 Fabrice Bellard, et al.
configuration: --prefix=/usr --bindir=/usr/bin
--datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib
--mandir=/usr/share/man --arch=i386 --extra-cflags=-O2
...
Я проверил, этот вывод ffmpeg направлен на stderr.
$ ffmpeg -i 01-Daemon.mp3 2> /dev/null
Поэтому я думаю, что grep не может прочитать поток ошибок, чтобы поймать совпадающие строки. Как мы можем включить grep для чтения потока ошибок?
Используя ссылку nixCraft , я перенаправил стандартный поток ошибок в стандартный поток вывода, затем сработал grep.
$ ffmpeg -i 01-Daemon.mp3 2>&1 | grep -i Duration
Duration: 01:15:12.33, start: 0.000000, bitrate: 64 kb/s
Но что, если мы не хотим перенаправлять stderr в stdout?
grep
может работать только на стандартный ввод. Это канал, созданный оболочкой, который соединяет stdin grep с stdout другой команды. И оболочка может только подключить стандартный вывод к стандартному вводу.
grep
может работать только на stdout (хотя я не могу найти канонический источник, подтверждающий это), что означает, что любой поток должен быть сначала преобразован в stdout.