为什么bash读取需要重定向

时间:2018-03-16 14:28:42

标签: bash heredoc

请原谅我,如果这是显而易见的,但我无法推理出来。目的是将一个heredoc分配给bash中的变量。本网站上的正确代码是:

read -r -d '' VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF

这非常有效。但我不明白为什么读取不会在没有重定向的情况下将数据加载到VAR

-d将分隔符设置为单引号。在遇到'并将该批次放入VAR之前,不应该吸收所有以下数据吗?

当然,这不会发生。我只是想知道为什么不。

1 个答案:

答案 0 :(得分:3)

read从stdin读取 - 而不是从脚本的源文件中读取。否则,它将毫无用处(用于提示用户,从单独的文件中读取等)。有关其使用的更多信息,请参阅BashFAQ #1

如果您在终端上运行脚本,则read默认从该终端读取;如果您将内容传递到脚本中,默认情况下read会从该内容中读取内容;等

read -r -d '' var,具体来说,从stdin读取直到看到NUL字符,或者发生文件结束条件(在后一种情况下,它以非零状态退出,但仍然填充目标变量)。

使用<<'EOF'从包含heredoc内容的临时文件重定向您的stdin。因此,即使文件不包含NUL,它最终也会命中EOF,因此控件将返回。