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


31

sh没有在语法上不是有效的bash代码的代码(语法上不会否定)?

我正在考虑sh使用bash某些命令覆盖。


1
我想有效是指我在语法上是有效的,因此它不会对语法产生影响
Alexander Mills

2
不同的标记化?我((想到了。
ccorn

1
对于某些发行版,/usr/bin/sh它只是一个符号链接/usr/bin/bash(我正在使用CentOS 7.3,确实如此)。您应该检查一下是否sh真的bash适合您的发行版。
Centimane

1
几年前,当bash中的某些东西“升级”时,我的整个项目就破裂了。我不得不将所有的shebang行从更改#!/bin/sh#!/bin/bash。然后,一切又恢复了,因此您确实必须要小心。当他们开始使用破折号而不是bash进行sh时,可能已经发生了。

1
@Joe,这与OP要求的相反-您的bash代码被错误地标记为sh代码,但不是。OP正在询问他们是否可以拥有(实际上,未贴错标签的)sh代码在使用bash运行时会中断,而不是是否可以让bash代码在使用sh运行时中断(这很明显-如果bash扩展没有对可用的语言功能没有任何影响,它们不会成为扩展)。
查尔斯·达菲

Answers:


49

这是一些在POSIX sh和Bash 中做一些不同的代码:

hello &> world

我不知道那是否对您“无效”。

在Bash中,它将标准输出和标准错误重定向hello到file world。在POSIX中sh,它hello在后台运行,然后进行空重定向到world,将其截断(即,将其视为& >)。

在很多其他情况下,Bash扩展程序在运行时bash也会发挥作用,并且在纯POSIX中会产生不同的效果sh。例如,括号扩展是另一种,并且它在Bash的POSIX模式下也可以相同地工作,而在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

“仅语法错误”是在任何情况下都非常危险的“无效”定义,但确实存在。


3
请注意,虽然大括号扩展当前使bash(和zsh,pdksh,ksh93)不兼容,但POSIX正在努力在规范中添加条款以允许大括号扩展(和{fd}>file类似的问题),以便bash可以再次保持一致(大括号扩展)会留下不明,但符合脚本需要做的echo "{a,b}"是,他们希望{a,b}成为输出)。见启动它的讨论
斯特凡Chazelas


2
有人在POSIX中编写脚本会写这样的命令吗?OP正在从sh变成bash,从我的理解来看,这似乎是朝着另一个方向发展的更大问题?
Rich

1
@Rich:好的。我不会在/bin/shbash上使用任何系统,因此,如果我不主动意识到这种bashism,那么编写命令行很容易发生。答案中的空格使其看起来不太可能,但hello&>world牵强一些。
R.,

2
由于&>上个月差异,我实际上看到了一个错误
戈登·戴维森

16

一个简短的例子:

time()(:)

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

简短的例子:

a():

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


3
更一般而言,在Bash中作为非标准关键字或内置命令的任何单词都会产生相同的效果。此外time,有这样的东西declarefunctionselect,和coproc。尽管其中一些在标准中(关键字Builtins / utilities)被明确标记为未指定,但是我看不到eg timecoproc列表中的内容。使用--posix似乎没有帮助。
ilkkachu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.