【问题标题】:shell error with "-bash: bad substitution: no closing `)'"带有“-bash:错误替换:没有关闭 `)'”的 shell 错误
【发布时间】:2015-12-05 13:14:11
【问题描述】:

我有这个脚本(只需将其复制并粘贴到 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 上修复它。

【问题讨论】:

  • bash --version 请在每台机器上使用。
  • 看来是解析器的bug;该错误发生在 3.2 版中,但不在 4.3 版中。
  • mac 版本是GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13),linux 版本是GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
  • @chepner 这是一个已知的错误吗?
  • 我认为是这样,除非 bash 4 中的解析器中的其他一些更改巧合地修复了它。如果您真正要问的是“会在 3.2 中修复吗?”,我会说答案是“否”。 3.x 分支将获得针对严重错误(如 Shellshock 漏洞)的安全补丁,但不太可能获得错误修复。

标签: macos bash


【解决方案1】:

可能是 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

【讨论】:

    【解决方案2】:

    这是bash 3.2 中的一个解析器错误,但您的示例是一个简单的此处文档的相当痛苦的替代:

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

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

    【讨论】:

    • 我知道。我对该特定格式还有其他用途。 :)
    猜你喜欢
    • 2014-01-08
    • 2014-01-04
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多