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