请原谅我,如果这是显而易见的,但我无法推理出来。目的是将一个heredoc分配给bash中的变量。本网站上的正确代码是:
read -r -d '' VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF
这非常有效。但我不明白为什么读取不会在没有重定向的情况下将数据加载到VAR
。
-d将分隔符设置为单引号。在遇到'
并将该批次放入VAR
之前,不应该吸收所有以下数据吗?
当然,这不会发生。我只是想知道为什么不。
答案 0 :(得分:3)
read
从stdin读取 - 而不是从脚本的源文件中读取。否则,它将毫无用处(用于提示用户,从单独的文件中读取等)。有关其使用的更多信息,请参阅BashFAQ #1。
如果您在终端上运行脚本,则read
默认从该终端读取;如果您将内容传递到脚本中,默认情况下read
会从该内容中读取内容;等
read -r -d '' var
,具体来说,从stdin读取直到看到NUL字符,或者发生文件结束条件(在后一种情况下,它以非零状态退出,但仍然填充目标变量)。
使用<<'EOF'
从包含heredoc内容的临时文件重定向您的stdin。因此,即使文件不包含NUL,它最终也会命中EOF,因此控件将返回。