也许我刚刚在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)答案 0 :(得分:3)
你看到了什么版本的bash? (我在3.2.25(1)-release
看到它,但在4.1.2(1)-release
或4.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
。