我source
这个小脚本来简化构建一些代码:
function buildprog () {
local builddir="/home/$USER/prog/build"
echo "$builddir"
# max threads - 2
local np=6
local old_wd=$(pwd)
local rel="Release"
local deb="Debug"
case $1 in
"all"); buildprog $rel & buildprog $deb;;
"$rel")
cd "${builddir}/$rel"; make -j $np;;
"$deb")
cd "${builddir}/$rel"; make -j $np;;
*)
echo "Build option '$1' unknown.";;
esac
cd $old_wd
}
complete -W "all Debug Release" buildprog
在我的一台机器Fedora 36 KDE上,这对bash
和zsh
都有效。在我的另一台机器上,使用Manjaro KDE(内核v.5.15.19-1),它报告了一个语法错误:
bash: ./testscript.sh: line 12: syntax error near unexpected token `;'
bash: ./testscript.sh: line 12: ` "all");'
两个系统都将bash --version
报告为5.1.16(1)-release
,只有一个区别:
Fedora上的(x86_64-redhat-linux-gnu)
和Manjaro上的(x86_64-pc-linux-gnu)
。
是什么原因导致在一台机器上允许单行版本,而在另一台机器上被认为是语法错误?
对于zsh
(Fedora上的v.5.8.1, Manjaro上的v.5.9),它可以在两台机器上工作。
我对Linux shell脚本很陌生,所以请温柔;)
修改后的注释:
的来源问题是额外的分号后"all")
case $1 in
# BAD "all"); buildprog $rel & buildprog $deb;;
"all") buildprog $rel & buildprog $deb;;
"$rel")
...
没有很好的解释为什么有些版本是宽容的。理论上,空语句(例如:';;')会导致语法错误。