类似的构造IFS= read -r var
通常被视为 Bash 中将一行输入读入变量的“规范”方式(例如在unix.SE上)。
很明显,为什么设置一个空$IFS
通常可能是有益的,即控制(防止)分词。然而,我很难理解为什么在阅读时特别需要这样做单身的多变的? bash 手册说:
如果单词数多于姓名,则剩余的单词及其中间分隔符将分配给姓氏
因此,即使不更改 IFS,如果read
传递单个变量,那么它最终不应该根据需要将整行保存到该变量中吗?$IFS
这种情况下设置空的原因是什么?
答案1
考虑这个示例(取消设置$IFS
以便使用默认值):
$ unset IFS
$ IFS= read -r foo <<<" a "
$ printf "%q\n" "$foo"
\ a\
$ read -r foo <<<" a "
$ printf "%q\n" "$foo"
a
或者当它包含不同的值时(在 bash 或除 zsh 之外的其他类似 POSIX 的 shell 中):
$ IFS=:
$ IFS= read -r foo <<< "a:"
$ printf "%q\n" "$foo"
a:
$ read -r foo <<< "a:"
$ printf '%q\n' "$foo"
a
此案例涵盖问题中提到的帖子(强调):
现在,如果仅传递一个参数,则不会变成
read line
.依然是read remaining_words
。反斜杠处理仍然完成,IFS 空白字符²仍从开头和结尾删除。