4

GNU bash 手册在讨论 shell 参数时有以下段落:

command内置函数不会阻止将赋值语句作为参数的内置函数扩展为赋值语句;当不在 POSIX 模式下时,赋值内置函数在命令前面时会丢失它们的赋值语句扩展属性。

我不知道它在说什么,并且由于这个原因,我也无法编写一个在常规模式和 posix 模式之间的赋值表达式行为不同的命令。

谁能找到这种差异的例子?

4

1 回答 1

9

谁能找到这种差异的例子?

是的,给你:

$ touch foo=bar
$
$ command declare foo=*
$ declare -p foo
declare -- foo="bar"
$
$ set -o posix
$ command declare foo=*
$ declare -p foo
declare -- foo="*"

在 POSIX 模式下,foo=*不会扩展为foo=bar; 它保持逐字记录,因为没有在赋值语句上执行路径名扩展。

但在正常模式下它会;前面declare带有被解释为常规参数而不是赋值语句的command原因;foo=*因此它经历了路径名扩展。

还有一个:

$ foo='x y=z'
$
$ command declare bar=$foo
$ declare -p bar y
declare -- bar="x"
declare -- y="z"
$
$ unset bar y
$ set -o posix
$ command declare bar=$foo
$ declare -p bar y
declare -- bar="x y=z"
bash: declare: y: not found

在这种情况下,不同之处在于在正常模式下$foo进行分词bar=x(因为它没有被引用),从而产生两个单独的参数,并且y=z. 但在 POSIX 模式下,空间被保留,扩展的结果不被分割。因此bar='x y=z'

于 2020-04-04T14:14:38.027 回答