Estou usando o ffmpeg para obter as informações meta de um clipe de áudio. Mas eu sou incapaz de cumprimentá-lo.
$ 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
...
Eu verifiquei, essa saída ffmpeg é direcionada para stderr.
$ ffmpeg -i 01-Daemon.mp3 2> /dev/null
Então, acho que o grep não consegue ler o fluxo de erro para pegar as linhas correspondentes. Como podemos habilitar o grep para ler o fluxo de erros?
Usando o link nixCraft , redirecionei o fluxo de erro padrão para o fluxo de saída padrão e o grep funcionou.
$ ffmpeg -i 01-Daemon.mp3 2>&1 | grep -i Duration
Duration: 01:15:12.33, start: 0.000000, bitrate: 64 kb/s
Mas e se não quisermos redirecionar o stderr para o stdout?
grep
só pode operar em stdin. É o pipe criado pelo shell que conecta o stdin do grep ao stdout do outro comando. E o shell pode conectar apenas um stdout a um stdin.
grep
só possa operar no stdout (embora não seja possível encontrar a fonte canônica para fazer o backup), o que significa que qualquer fluxo precisa ser convertido para o stdout primeiro.