是否有任何sh
代码在语法上不是有效的 bash 代码(不会因语法而呕吐)?
我正在考虑sh
用bash
某些命令覆盖。
答案1
这是一些代码做一些不同的事情在 POSIX sh 和 Bash 中:
hello &> world
我不知道这对你来说是否“无效”。
在 Bash 中,它重定向标准输出和标准错误从hello
进入文件world
。在 POSIX 中sh
,它hello
在后台运行,然后进行空重定向到world
,截断它(即它被视为& >
)。
在许多其他情况下,Bash 扩展在运行时会发挥作用bash
,并且在纯 POSIX 中会产生不同的效果sh
。例如,大括号扩展是另一个,它在 Bash 的 POSIX 模式下也同样运行,但不是。
就静态语法错误而言,Bash 具有POSIX 未指定的保留字(如[[
和),例如,这是有效的 POSIX shell 代码,但有 Bash 语法错误,以及各种历史记录time
[[ x
POSIX 不兼容错误可能会导致语法错误,例如此问题中的错误:
x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file
对于任何重要的情况来说,仅语法错误都是“无效”的一个非常危险的定义,但它确实存在。
答案2
一个简短的例子:
time()(:)
time
在 Bash 中是一个保留字,其行为与程序不同time
。您很可能会破坏一些尝试time
使用 bash解析结果的实际脚本。但从技术上讲,这不是语法错误。重新定义time
为函数的情况很少见,但会导致语法错误,如本问题所指定。
一个更短的例子:
a():
在 中有效dash
,但不符合 POSIX 标准。