gpt4 book ai didi

POSIX 与非 POSIX 模式下的 Bash 赋值语句扩展

转载 作者:行者123 更新时间:2023-12-03 19:42:35 27 4
gpt4 key购买 nike

GNU bash manual说到shell参数有以下一段话:

The command builtin does not prevent builtins that take assignment statements as arguments from expanding them as assignment statements; when not in POSIX mode, assignment builtins lose their assignment statement expansion properties when preceded by command.



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

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

最佳答案

Can anyone find an example of this difference?


是的,给你:
$ 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 ;它保持逐字记录,因为 pathname expansion不在赋值语句上执行。
但在正常模式下确实如此;前 declarecommand原因 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经历 word splitting (因为它没有被引用)在正常模式下,导致两个单独的参数, bar=xy=z .但是在POSIX模式下,空间是保留的,扩展的结果没有 split 。因此 bar='x y=z' .

关于POSIX 与非 POSIX 模式下的 Bash 赋值语句扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61029087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com