Ich verwende ffmpeg, um die Metainformationen eines Audioclips abzurufen. Aber ich kann es nicht fassen.
$ 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
...
Ich habe überprüft, dass diese ffmpeg-Ausgabe an stderr gerichtet ist.
$ ffmpeg -i 01-Daemon.mp3 2> /dev/null
Daher denke ich, dass grep den Fehlerstrom nicht lesen kann, um übereinstimmende Zeilen abzufangen. Wie kann grep das Lesen von Fehlerströmen ermöglichen?
Unter Verwendung von nixCraft link habe ich den Standardfehlerstrom auf den Standardausgabestrom umgeleitet, dann hat grep funktioniert.
$ ffmpeg -i 01-Daemon.mp3 2>&1 | grep -i Duration
Duration: 01:15:12.33, start: 0.000000, bitrate: 64 kb/s
Was aber, wenn wir stderr nicht auf stdout umleiten wollen?
grep
Kann nur mit stdin arbeiten. Es ist die Pipe, die von der Shell erstellt wurde und die die Standardeingabe von grep mit der Standardeingabe des anderen Befehls verbindet. Und die Shell kann nur einen stdout mit einem stdin verbinden.
grep
kann nur mit stdout funktionieren (obwohl ich die kanonische Quelle nicht finden kann, um das zu sichern), was bedeutet, dass jeder Stream zuerst in stdout konvertiert werden muss.