`cat EOF`と`cat EOT`の違いは何ですか、いつ使うべきですか?

`cat EOF`と`cat EOT`の違いは何ですか、いつ使うべきですか?

cat > /path/to/file << EOFBashスクリプトで1つのファイルに複数行を印刷するときは、次のように使い慣れています。会社の前のコードをチェックして、よく知られたコードの代わりに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

これら2つの文字列または他の文字列の間に違いはなく、特別な意味もありません。これは任意のターミネータにすぎないので、必要なほとんどすべての文字列を使用できます。

もちろん、データ自体には対応する特定の行を含めることはできません。したがって、データに異なるhereドキュメントを含むシェルスクリプトなどが含まれている場合は、両方のドキュメントで異なるターミネータを使用する必要があります。一種の説明文字列を使用すると、将来のスクリプト読者に役立つ可能性があります。

例えば

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

test.shシェルを介して実行されたときに生成される印刷hello

ただし、here 文書を開始する行に終端子を引用すると違いはありますが、here document データの拡張を妨げることになります。これにより、$i変数の値が代わりに印刷されます。

cat << 'EOF'
$i
EOF

また見なさい:

答え2

2番目の質問に最初に答えます。

つまり、プロジェクトのコーディングスタイルガイドに必要なものは何でも使用する必要があります。それ以外の場合は、独自のガイドを使用する必要があります。言葉のない好み。

私が使用するコードエディタはhere-doc演算子を入力するたびに "EOF"を生成します。しかし、私は個人的に実際にシェルの特殊文字ではなく「!」を好みます。 (ここは文書区切り記号として偶然に使用される予約語です)

最初の質問に戻ります。 EOT は、実際に Unix システムの慣例に基づいて、端末設定に他の変更がない場合に端末入力を読み取るプログラムのファイル終了表示を生成する ASCII 制御文字です。

したがって、異なるhere文書の重複部分を分離することに加えて、EOFとEOTを区別することも、here文書内容の目的をある程度表現する役割を果たすことができる。

ついに。関連する他の質問は、EOFがEOTと異なる値を持つ理由についての説明を必要とします。説明したように、EOFは状況、EOTは有効なバイト値と文字ですが、EOFはデフォルトの端末設定でEOT文字から生成されます。

関連情報