cat > /path/to/file << EOF
当我在 bash 脚本中将多行打印到文件中时cat EOT
,我cat EOF
习惯使用... T而不是它末尾的F )和好奇心让我心烦意乱。
我做了一个快速的研究,我只发现了另一个问题,但我认为它与我想知道的无关。
我用以下代码做了一些测试:
password=hello
cat > ./hello.txt << EOT
authentication {
auth_type PASS
auth_pass $password
}
EOT
我得到的输出与我使用EOF
而不是EOT
. 正如预期的那样,输出是:
root@test_VM:~# bash test.sh && cat hello.txt
authentication {
auth_type PASS
auth_pass hello
}
所以问题是:
EOT
和的用法有什么区别EOF
?- 我什么时候应该使用其中一种?
这两个字符串或任何其他字符串没有区别,也没有特殊含义。它只是一个任意终止符,您几乎可以使用任何您喜欢的字符串。
当然,数据本身不能包含该特定行,因此如果您的数据包含例如一个带有另一个 here-doc 的 shell 脚本,则您需要在两者中使用不同的终止符。使用有点描述性的字符串可能对脚本的任何未来读者有用。
例如
产生
test.sh
which,当通过 shell 执行时打印hello
.如果您在开始 here-doc 的行中引用终止符,则会有所不同,但它会阻止 here-doc 数据中的扩展。这将打印
$i
,而不是变量的值:也可以看看:
我先回答你的第二个问题。
也就是说,你应该使用你的项目编码风格指南所要求的任何东西——或者如果没有,你自己的一致偏好。
每当我键入 here-doc 运算符时,我使用的代码编辑器都会生成“EOF”,尽管我个人更喜欢“!” 这实际上不是 shell 的特殊字符。(这是一个保留字,恰好可用作 here-doc 分隔符)
回到第一个问题。EOT 实际上是一个 ASCII 控制字符,按照 Unix 系统的约定,当终端设置没有以其他方式更改时,它会为程序读取终端输入生成文件结束指示。
因此,区分 EOF 和 EOT 在某种程度上可以表示 here-doc 内容的目的,此外还可以区分不同 here-doc 的重叠部分。
最后。您链接的另一个问题要求解释为什么 EOF 具有与 EOT 不同的值。如前所述,EOF 是一个条件,而 EOT 是一个有效的字节值和字符,而 EOF 是在默认终端设置下由 EOT 字符生成的。