为什么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线程中的回答,然后回来

回答:

在我在问题中提出的第二种方式中,我们将一个定界文档传递给 Bash 上的文件描述符而不是 0(在本例中为 5):

短语的第一部分bash /dev/fd/5表示以文件描述符 5 作为输入的 bash,第二部分5<< EOF告诉 shell 将 here-doc 写入该文件描述符。

笔记:

  1. Heredoc层次结构与相关文件描述符的数量无关。
  2. 我给出数字 5 只是因为它是一个远离零的好数字。 AFAIK,你可以给 50,或 500,或 50,000,它会以同样的方式工作。

相关内容