用于此处文档的“文件结尾”一词从何而来?
something <<EOF
something else 1
something else 2
...
EOF
我假设有一些历史可以证明非直观的限制字符串是合理的,并且阅读Wikipedia 的文章还不够:为什么“文件”仍然遍布程序,而流和块更常用于构建此处的文档?
它来自 Unix 传统,一切都是文件。在这种情况下,“文件”并不意味着“磁盘文件”,也不一定意味着任何相关的元数据——它意味着更接近现在被称为“流”的东西。最多,“文件”是“由文件描述符访问的东西”。换句话说,您正在生成的进程的 STDIN是一个文件,而 heredoc 的 EOF 标志着它的结束。
因为 EOF 代表“文件结尾”传统上被用作在程序中读取文件时返回的标记或异常的名称,以指示已到达文件末尾。这是一个非常古老的用法。
因此,当在这里编写文档并且您需要一个标记来标记它的结尾(这应该是不太可能意外发生的事情)时,如果您习惯使用该短语来指代结尾,“EOF”会很自然地浮现在脑海中——文件标记。由于它被如此频繁地使用,它甚至被那些不习惯以这种方式思考 EOF 的人所接受,因为他们在学习如何使用这里文档时看到它在示例中使用。因此使用传播。
这只是一个约定。在 shell 脚本中,您几乎可以使用任何东西,例如,
cat <<stackoverflow
something else 1
something else 2
...
stackoverflow
inbash
和它说的一样EOF
。