IFS 中的空白与 IFS 中的非空白之间的行为差​​异

Difference in behaviour between whitespace in IFS vs. non-whitespace in IFS

我知道 read 命令按 IFS 中的字符拆分输入。因此,如果我将 IFS 设置为 space,则 read 命令的输入将使用 space 作为分隔符进行拆分。如下所示。

[lone@centos ~]$ IFS=" "
[lone@centos ~]$ read a b c
 foo bar baz qux
[lone@centos ~]$ echo "$a"
foo
[lone@centos ~]$ echo "$b"
bar
[lone@centos ~]$ echo "$c"
baz qux

我原以为如果我将 IFS 更改为非白色 space 字符,例如冒号并在我的输入中使用冒号作为分隔符,则行为应该没有变化。但事实证明这是错误的。例如,在下面的输出中,echo "$a" 是空白的。为什么?

[lone@centos ~]$ IFS=:
[lone@centos ~]$ read a b c
:foo:bar:baz:qux
[lone@centos ~]$ echo "$a"

[lone@centos ~]$ echo "$b"
foo
[lone@centos ~]$ echo "$c"
bar:baz:qux
[lone@centos ~]# echo $c
bar baz qux

为什么 echo $c 的输出不包含冒号?

问题 1:在下面的输出中,echo "$a" 是空白的。为什么?

因为空格在 POSIX 中定义是特殊的 (2.6.5 Field Splitting):

3a. IFS white space shall be ignored at the beginning and end of the input.

问题 2:为什么 echo $c 的输出不包含冒号?

因为bash按照IFS进行分词(还是设置为:before传递barbazqux 作为 echo.

的单独参数