`cat EOF` 和 `cat EOT` 有什么区别,什么时候应该使用它?

k.C*_*org 6 shell bash shell-script cat

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
Run Code Online (Sandbox Code Playgroud)

EOF我得到的输出与我使用代替时完全相同EOT。正如预期的那样,输出是:

root@test_VM:~# bash test.sh && cat hello.txt

authentication {
    auth_type PASS
    auth_pass hello
  }
Run Code Online (Sandbox Code Playgroud)

所以问题是:

  1. EOT和的使用有什么区别EOF
  2. 我什么时候应该使用其中一种而不是另一种?

ilk*_*chu 25

这两个字符串或任何其他字符串没有区别,也没有特殊含义。它只是一个任意终止符,您几乎可以使用任何您喜欢的字符串。

当然,数据本身不能包含该特定行,因此,如果您的数据包含例如具有另一个此处文档的 shell 脚本,则需要在两者中使用不同的终止符。使用某种描述性的字符串可能对脚本的任何未来读者都有用。

例如

cat > test.sh <<END_OF_SCRIPT
cat <<EOF
hello
EOF
END_OF_SCRIPT
Run Code Online (Sandbox Code Playgroud)

test.sh当通过 shell 执行时会生成which 打印hello

但是,如果您在启动此处文档的行中引用终止符,则会存在差异,但它会阻止此处文档数据的扩展。这将打印$i,而不是变量的值:

cat << 'EOF'
$i
EOF
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • @ilkkachu以避免创建heredoc(至少在现代shell中,IIRC在Bourne shell的早期版本中,仍然会创建here doc) (6认同)
  • 例如,我使用了诸如`:||:&lt;&lt;'# some comment'`之类的东西来注释掉一些代码,例如`# some comment`。 (5认同)
  • @k.Cyborg 该标签在某种程度上可用于文档。例如,问题中的代码可以使用“AUTH_CONF_END”或类似的标签。 (3认同)