我发布这个问题并给出答案,以便向新用户澄清为什么某些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 写入该文件描述符。
笔记:
- Heredoc层次结构与相关文件描述符的数量无关。
- 我给出数字 5 只是因为它是一个远离零的好数字。 AFAIK,你可以给 50,或 500,或 50,000,它会以同样的方式工作。