0

我正在尝试sh使用 ffprobe 在 OSX 脚本中获取音频类型:ffprobe "$i" |& egrep -ci "vorbis|aac"它适用于 cli intcsh但不适用于脚本。|&似乎在脚本内部不起作用。|&重定向 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"'
4

1 回答 1

0

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

也许对您的脚本最直接的直接解决方案是运行它bash而不是sh,前者支持tcsh您尝试使用的语法,这不仅是巧合,而且因为它也从 , 借来了许多好的和一些不太好的想法tcsh,同时保留了完整的向后兼容 POSIX sh

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

tcsh对于脚本和交互式使用,应该避免广泛的共识——我建议您也考虑切换到bash交互式使用,这将统一您显然已经用于脚本的语法和交互式使用的语法。事实上,由于使用不兼容的交互式 shell,您目前错过了 shell 的一个吸引人的特性。

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

于 2015-12-06T12:05:32.027 回答