这个命令:
read -d 'z' a < <(printf 'a\n\n\n'); printf "$a"
输出:
a
bashread
删除了预期的多余尾随换行符。
并通过更改IFS
为空字符:
IFS= read -d 'z' a < <(printf 'a\n\n\n'); printf "$a"
它输出:
a
(blank line)
(blank line)
read
不再删除多余的尾随换行符,因为IFS
不再包含换行符...
但现在如果我们做同样的事情,但用m
换行符代替:
IFS=m read -d 'z' a < <(printf 'ammm'); printf "$a"
有人会认为输出是:
a
但实际输出是:
ammm
即现在read
不会删除多余的尾随IFS
字符(在本例中为m
字符)。
为什么?
字段拆分特别忽略了前导和尾随 IFS 空格。来自GNU Bash 手册,3.5.7 Word Splitting:
礼貌不会扩展到非空白字符。您可以使用其他字段拆分实例进行检查:
默认情况下,读取去除前导/训练空白和换行符。如果添加 IFS 则默认值存在,因此 read 不会删除它们。
在你的例子中
你给了
IFS
一个值,所以现在你有 2 个字段/列,但你只给了一个变量来读取它是 a,如果你给了另一个变量,它将保存第二个字段我不擅长细节,所以有人可以解释更多,但这就是我的理解。