shell错误" -bash:bad substitution:no closing`)'"

时间:2015-09-09 14:04:11

标签: macos bash

我有这个脚本(只需将其复制并粘贴到shell中)

perl -c <(cat <<'EOF'
#!/usr/bin/perl
while( @mylist>1){
if($i > $initnum) {$i--;}
   {splice( @mylist,1);}
}
EOF
)

在一台linux机器上,我输出/dev/fd/63 syntax OK,这没关系。但是在macbook终端上,我看到了这个

$ perl -c <(cat <<'EOF'
> #!/usr/bin/perl
> while( @mylist>1){
> if($i > $initnum) {$i--;}
>    {splice( @mylist,1);}
> }
> EOF
> )
-bash: bad substitution: no closing `)' in <(cat <<'EOF'
#!/usr/bin/perl
while( @mylist>1){
if($i > $initnum) {$i--;}
   splice( @mylist
}
EOF
)

我的问题是为什么会出现这样的错误。理想情况下如何在Mac上修复它。

2 个答案:

答案 0 :(得分:3)

它是bash 3.2中的解析器错误,但您的示例是一个非常折磨的替代简单的文档:

perl -c <<'EOF'
#!/usr/bin/perl
while( @mylist>1){
if($i > $initnum) {$i--;}
   {splice( @mylist,1);}
}
EOF

默认情况下Apple似乎不会发布更新版本的bash,因此您最好自己安装一个版本(例如,通过Homebrew)。

答案 1 :(得分:2)

可能是MacOS上bash的不兼容版本(或@chepner评论的破解版本),因此您可以使用echo天真地重写它:

echo '#!/usr/bin/perl
while( @mylist>1){
if($i > $initnum) {$i--;}
    {splice( @mylist,1);}
}
' | perl -c

或者,如果您需要保留cat业务,可以将其归为pipeline

cat <<'EOF' | perl -c
#!/usr/bin/perl
while( @mylist>1){
if($i > $initnum) {$i--;}
   {splice( @mylist,1);}
}
EOF