我正在使用 ffmpeg 来获取音频剪辑的元信息。但我无法grep它。
$ 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
...
Run Code Online (Sandbox Code Playgroud)
我检查过,这个 ffmpeg 输出被定向到 stderr。
$ ffmpeg -i 01-Daemon.mp3 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
所以我认为 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
Run Code Online (Sandbox Code Playgroud)
但是如果我们不想将 stderr 重定向到 stdout 呢?
当脚本运行时,其中的命令可能会向 stdout/stderr 输出一些文本。Bash 本身也可能输出一些文本。
但是如果同时运行几个脚本,就很难确定错误来自哪里。
那么是否可以在脚本的所有输出中插入前缀?就像是:
#!/bin/bash
prefix 'PREFIX' &2
echo "wrong!" >&2
Run Code Online (Sandbox Code Playgroud)
然后:
$ ./script.sh
PREFIXwrong!
Run Code Online (Sandbox Code Playgroud)