是否有任何 sh 代码在语法上不是有效的 bash 代码?

是否有任何 sh 代码在语法上不是有效的 bash 代码?

是否有任何sh代码在语法上不是有效的 bash 代码(不会因语法而呕吐)?

我正在考虑shbash某些命令覆盖。

答案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[[ xPOSIX 不兼容错误可能会导致语法错误,例如此问题中的错误:

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 标准。

相关内容