Here-Document

為什麼 heredocs“依賴”文件描述符?

  • March 22, 2017

我發布了這個問題並給出了答案,以便向新使用者澄清,為什麼某些 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

需要對“文件描述符”的整個概念進行介紹才能理解這個答案 - 什麼是“文件描述符”以及我們為什麼需要它。如果你已經有了這樣的介紹,請跳到下面的答案;不要 —請閱讀我在這個 SE 執行緒中的答案,然後再回來

回答:

在我在問題中提出的第二種方式中,我們通過一個非 0 的文件描述符(在本例中為 5:

片語的第一部分bash /dev/fd/5, 表示以文件描述符 5 作為輸入的 bash,第二部分 ,5<< EOF告訴 shell 將 here-doc 寫入該文件描述符。

筆記:

  1. heredoc 層次結構與相關文件描述符的數量無關。
  2. 我給出數字 5 只是因為它是一個遠離零的好數字。AFAIK,你可以給 50,或 500,或 50,000,它會以同樣的方式工作。

您的第一個範例失去cat 了它不需要文件描述符。

bash << EOF0 

command1
cat << E0F1
       Proudly_Printed_With_Heredoc
EOF1

E0F0

但是,如果您想與某些命令互動而不是讓它們從 heredoc 獲取輸入,則需要文件描述符。

引用自:https://unix.stackexchange.com/questions/331786