在sh脚本中管道ffprobe

时间:2015-12-06 02:11:56

标签: shell sh tcsh ffprobe

我尝试使用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 $1;}' "$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"'

1 个答案:

答案 0 :(得分:0)

您正试图在tcsh脚本中使用sh语法;虽然你似乎不知道它们是两种不同的语言,但这不起作用的事实应该不足为奇。

对于您的脚本来说,最简单的直接解决方案可能是在bash而不是sh中运行它,前者支持您尝试使用的tcsh语法,而不仅仅是巧合但是因为它保留了tcsh中许多好的和不太好的想法,同时保留了与POSIX sh的完全向后兼容性。

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

对于脚本和交互式使用应该避免tcsh达成广泛的共识 - 我建议您考虑切换到bash以进行交互式使用,这将统一显示您的语法已经用于具有交互式使用语法的脚本。实际上,通过使用不兼容的交互式shell,您目前错过了shell的一个吸引人的功能。

汤姆克里斯蒂安森的docs是对C shell的规范参考批评。虽然tcsh修复了csh中的大量错误和不一致问题,但许多仍然存在。切换到主导shell之一还将为您提供更广泛的帮助,学习和故障排除资源网络,以支持您。