在大多数 POSIX 兼容 shell 中,例如bash
. ksh
, dash
, mksh
, pdksh
,当发生变量赋值时,在赋值的右侧不执行字段分割和文件名扩展(如果 shell 支持,还包括大括号扩展):
$ IFS=/
$ a=1/2
# Field splitting and filename expansion turned off here
$ b=$a
$ IFS=
$ printf '%s\n' $b
1/2
一些 shell 的文档(巴什,克什)提到过这一点,但是POSIX 文档没有。
我可以在大多数 POSIX 兼容 shell 中看到这种行为,所以我想知道它是否可移植,因为 POSIX 文档没有指定它?
答案1
取决于你从哪里看。从第 2 章,第 9.1 节:
每个变量赋值都应在赋值之前进行扩展,以进行波形符扩展、参数扩展、命令替换、算术扩展和引号删除。
我认为这个列表是详尽的,因为场分裂没有提到,缺少字段分割是 POSIX 指定的。