在大多数符合 POSIX 标准的 shell 中,如bash
. ksh
, dash
, mksh
, pdksh
, 当变量赋值发生时,在赋值的 RHS 中不执行字段拆分和文件名扩展(如果 shell 支持,则扩展括号):
$ IFS=/
$ a=1/2
# Field splitting and filename expansion turned off here
$ b=$a
$ IFS=
$ printf '%s\n' $b
1/2
Run Code Online (Sandbox Code Playgroud)
一些 shell 的文档(bash,ksh)提到了这一点,但POSIX 文档没有。
我可以在大多数符合 POSIX 的 shell 中看到这种行为,所以我想知道它是否可移植,因为 POSIX 文档没有指定它?
取决于你在哪里看。从第 2 章第 9.1 节:
在分配值之前,每个变量分配都应针对波浪号扩展、参数扩展、命令替换、算术扩展和引号删除进行扩展。
我认为这个列表是详尽的,并且由于没有提到字段拆分,缺少字段拆分是 POSIX 指定的。