意外令牌附近的语法错误`('(可能的bash bug)

时间:2015-11-06 10:58:22

标签: bash

也许我刚刚在bash的解析器中引发了一个错误,但是在提交bug报告之前我还是不想问,也许我只是失明而且它已经失败了。毕竟不是bash bug ...

这是脚本(确定,实际版本的精简版):

$ cat bash-parse-error.1.sh
#! /bin/sh

echo "$(
    if false
    then
            exit 0
    fi

    # echo "("
    case FOO in
            FOO)
                    echo "("
                    ;;
    esac
)"
$ ./bash-parse-error.1.sh
./bash-parse-error.1.sh: line 12: syntax error near unexpected token `('
./bash-parse-error.1.sh: line 12: `                 echo "("'

现在,如果我对额外的echo命令进行取消注释,脚本就会按预期工作,打印两个开放的括号:

$ cat bash-parse-error.2.sh
#! /bin/sh

echo "$(
    if false
    then
            exit 0
    fi

    echo "("
    case FOO in
            FOO)
                    echo "("
                    ;;
    esac
)"
$ ./bash-parse-error.2.sh
(
(

或者,删除if-false-then-exit块(用注释掉的echo命令做任何我想做的事情)也会使错误消失:

$ cat bash-parse-error.3.sh
#! /bin/sh

echo "$(
    case FOO in
            FOO)
                    echo "("
                    ;;
    esac
)"
$ ./bash-parse-error.3.sh
(

那么,是我还是bash?

/编辑: a)无需解决方法,已经有了一个,无论如何

b)#! / usr / bash显然表现出同样的问题,因为

c)测试版本:4.3.33(1)和4.3.39(1)

1 个答案:

答案 0 :(得分:3)

你看到了什么版本的bash? (我在3.2.25(1)-release看到它,但在4.1.2(1)-release4.3.42(1)-release看不到。)

在case语句中使用可选的(也可以解决问题。

关于这个的问题已经提交给shellcheck https://github.com/koalaman/shellcheck/issues/482,它引用了Command Substitution Bash Hackers Wiki页面,它也讨论了它(作为“要避免的构造”)。

虽然从技术上来说问题是关闭)而不是你在这里找到的开场白。

bash 4.2.46(1) - 从.1.sh发出来自CentOS 7的失败,但对另外两个失败了。并在其中添加(修正.1.sh