在 sh 脚本中管道 ffprobe

pipe ffprobe in sh script

我正在尝试使用 ffprobe 在 OSX sh 脚本中获取音频类型:ffprobe "$i" |& egrep -ci "vorbis|aac" 它在 tcsh 中的 cli 中有效,但在脚本中无效。 |& 似乎在脚本内部不起作用。 |& 重定向 ffprobe 的输出,否则 ffprobe 打印到 cli。感谢任何帮助。

##mkv files
for i in "$input"*.mkv ; do
    if [ -e "$i" ] ; then
         ##1st check type(vorbis|aac)
         type=$(/usr/local/bin/ffprobe "$i" |& egrep -i "vorbis|aac")
         echo "Test: $type"
         ##just get audio format
         type=$(/usr/bin/perl -e '$_=@ARGV[0];if (/(aac|vorbis)/ig) {print ;}' "$type")
         echo "Type: $type"
         exit
    fi
done

我得到的错误是:

command substitution: line 46: syntax error near unexpected token `&'
command substitution: line 46: `/usr/local/bin/ffprobe "$i" |& egrep -i "vorbis|aac"'

您正试图在 sh 脚本中使用 tcsh 语法;这不起作用这一事实应该不足为奇,尽管您似乎没有意识到它们是两种不同的语言。

也许对您的脚本最直接的直接解决方案是 运行 它在 bash 而不是 sh 中,前者支持您尝试的 tcsh 语法使用,不仅仅是巧合,还因为它也从 tcsh 借用了许多好的和一些不太好的想法,同时保持与 POSIX sh.

的完全向后兼容性

假设您想要的信息打印到标准输出 py ffprobe,您也可以切换到常规管道,并保留 sh shebang 行。无论哪种方式,都不推荐使用 sh 显式调用脚本——只需将文件标记为可执行文件并直接调用它,系统将使用 shebang 指定的任何解释器(相反,shebang 将被简单地忽略,如果您明确指定了一个解释器)。

人们普遍认为 tcsh 应该避免用于脚本和交互使用——我建议您也考虑切换到 bash 进行交互使用,这将统一语法您显然已经使用具有交互式语法的脚本。事实上,由于使用不兼容的交互式 shell.

,您目前错过了 shell 的一项吸引人的功能

Tom Christiansen 的 csh.whynot 是 C shell 的规范参考批评。虽然 tcsh 修复了 csh 中的大量错误和不一致之处,但许多仍然存在。切换到其中一个主要 shell 还可以为您提供更广泛的帮助、学习和故障排除资源网络来支持您。