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

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

cat > /path/to/file << EOF当我在 bash 脚本中将多行打印到文件中时,我习惯使用...我正在检查我公司的旧代码,我发现了cat EOT指令而不是cat EOF我习惯的指令(请注意时间而不是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
  }

所以问题是:

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

答案1

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

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

例如

cat > test.sh <<END_OF_SCRIPT
cat <<EOF
hello
EOF
END_OF_SCRIPT

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

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

cat << 'EOF'
$i
EOF

也可以看看:

答案2

我先回答你的第二个问题。

也就是说,您应该使用您的项目编码风格指南所要求的任何内容 - 或者如果没有,您自己的持续的偏爱。

每当我键入here-doc运算符时,我使用的代码编辑器都会生成“EOF”,尽管我个人更喜欢“!”这实际上并不是 shell 的特殊字符。 (这是一个保留字,恰好可以用作此处文档分隔符)

回到第一个问题。 EOT 实际上是一个 ASCII 控制字符,按照 Unix 系统上的约定,当终端设置未进行其他更改时,它会为程序读取终端输入生成文件结束指示。

因此,除了分隔不同此处文档的重叠部分之外,区分 EOF 和 EOT 还可以在某种程度上表示此处文档内容的目的。

最后。您链接的另一个问题要求解释为什么 EOF 具有与 EOT 不同的值。正如所解释的,EOF 是状况,而EOT是有效的字节值和字符,EOF是在默认终端设置下由EOT字符生成的。

相关内容