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

Ale*_*lls 31 bash shell-script posix

是否有任何sh代码在语法上不是有效的 bash 代码(不会对语法造成障碍)?

我想重写shbash某些命令。

Mic*_*mer 48

以下是一些在 POSIX sh 和 Bash中执行不同操作的代码:

hello &> world
Run Code Online (Sandbox Code Playgroud)

我不知道这对你来说是否“无效”。

在bash中,这两个标准输出和标准错误重定向hello入档world。在 POSIX 中sh,它hello在后台运行,然后将空重定向到world,截断它(即它被视为& >)。

在许多其他情况下,Bash 扩展在运行时bash会发挥作用,并且在纯 POSIX 中会产生不同的效果sh。例如,大括号扩展是另一种,它在 Bash 的 POSIX 模式下也有相同的操作,而不是。


就静态语法错误而言,Bash 有两个未由 POSIX 指定的保留字(如[[time),即[[ x有效的 POSIX shell 代码但 Bash 语法错误,以及可能导致语法错误的各种POSIX 不兼容错误的历史记录,例如来自这个问题的那个

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

对于任何重要的情况,仅语法错误是“无效”的一个非常危险的定义,但它确实存在。

  • 请注意,虽然大括号扩展当前使 bash(和 zsh、pdksh、ksh93)不兼容,但 [POSIX 正在努力在规范中添加条款以允许大括号扩展](http://austingroupbugs.net/view.php?id= 1193)(和 `{fd}&gt;file` 类似的问题),以便 bash 可以再次符合(大括号扩展将保持未指定,但兼容的脚本需要执行 `echo "{a,b}"` 是他们想要的`{a,b}` 将被输出)。参见[启动它的讨论](https://www.mail-archive.com/austin-group-l@opengroup.org/msg02173.html) (3认同)
  • 也与此问答相关:http://austingroupbugs.net/view.php?id=1191#c3983 (2认同)
  • 用 POSIX sh 编写脚本的人会写这样的命令吗?OP 正在从 sh 转到 bash,根据我的理解,这似乎是另一个方向的问题? (2认同)
  • 就在上个月,我实际上看到了 [由于 `&amp;&gt;` 差异导致的错误](/sf/ask/3480048841/)! (2认同)

use*_*013 17

一个简短的例子:

time()(:)
Run Code Online (Sandbox Code Playgroud)

timein Bash 是一个保留字,其行为与time程序不同。您很可能会破坏一些尝试time使用 bash解析结果的实用脚本。但从技术上讲,这不是语法错误。重新定义time为函数的情况很少见,但会导致此问题指定的语法错误。

一个较短的例子:

a():
Run Code Online (Sandbox Code Playgroud)

在 中有效dash,但不符合 POSIX。

  • 更一般地,任何在 Bash 中是非标准关键字或内置命令的单词都会导致相同的效果。除了`time`,还有`declare`、`function`、`select`和`coproc`之类的东西。尽管其中一些在标准([关键字](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_04)和[builtins/utilities](http:// pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01))),但我在列表中看不到例如`time`或`coproc`。使用`--posix` 似乎没有帮助。 (3认同)