Korzystam z ffmpeg, aby uzyskać meta informacje o klipie audio. Ale nie jestem w stanie tego zepsuć.
$ 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
...
Sprawdziłem, to wyjście ffmpeg jest kierowane do stderr.
$ ffmpeg -i 01-Daemon.mp3 2> /dev/null
Myślę więc, że grep nie może odczytać strumienia błędów, aby złapać pasujące linie. Jak możemy włączyć grep do odczytu strumienia błędów?
Za pomocą linku nixCraft przekierowałem standardowy strumień błędów do standardowego strumienia wyjściowego, a następnie grep zadziałał.
$ ffmpeg -i 01-Daemon.mp3 2>&1 | grep -i Duration
Duration: 01:15:12.33, start: 0.000000, bitrate: 64 kb/s
Ale co, jeśli nie chcemy przekierowywać stderr na stdout?
grep
może działać tylko na standardowym wejściu . Jest to potok utworzony przez powłokę, który łączy stdin grep z stdout drugiego polecenia. A powłoka może tylko podłączyć stdout do stdin.
grep
może działać tylko na standardowym wyjściu (chociaż nie mogę znaleźć źródła kanonicznego, które by to poparło), co oznacza, że każdy strumień musi zostać najpierw przekonwertowany na standardowe wyjście.