heredocsがファイル記述子に「依存」するのはなぜですか?

heredocsがファイル記述子に「依存」するのはなぜですか?

私は、特定のheredoc構文がファイル記述子を処理する理由を新しいユーザーに明確にするために、この質問と回答を投稿しました。最初は理解するのに苦労しました。

例をご覧ください。

bash << EOF0 

    command1
    << E0F1
        Proudly_Printed_With_Heredoc
    EOF1

E0F0

なぜこれを行うべきですか:

bash /dev/fd/5 5<< 'EOF0'
    command1
    cat << EOF1 >> /etc/apache2/apache2.conf
        Proudly_Printed_With_Heredoc
    EOF1
EOF0

答え1

最初の例がないため、cat ファイル記述子は不要です。

bash << EOF0 

command1
cat << E0F1
        Proudly_Printed_With_Heredoc
EOF1

E0F0

ただし、heredocから入力を受け取るのではなく、特定のコマンドと対話するにはファイル記述子が必要です。

答え2

この答えを理解するには、「ファイル記述子」の完全な概念を紹介する必要があります。 「ファイル記述子」とは何で、なぜ必要なのか。すでにそのような紹介がある場合は、以下の回答にスキップしてください。いいえ - -このSEスレッドで私の答えを読んで、もう一度来てください。

答え:

質問で私が要求した2番目の方法では、0(この場合は5)ではなくBashのファイル記述子に区切られた文書を渡します。

フレーズの最初の部分はbash /dev/fd/5ファイル記述子5を入力として使用するbashを表し、2番目の部分は5<< EOFシェルにそのファイル記述子にhere-docを書き込むように指示します。

メモ:

  1. Heredoc階層は、関連するファイル記述子の数とは無関係です。
  2. 0から離れている良い数字なので、数字5を与えました。 AFAIK、50、500、50,000を与えることができ、同じように動作します。

関連情報