Shell

cat > file << ‘END’ 是如何工作的?

  • May 2, 2019
$ cat &gt; file &lt;&lt; "END"
> asdf
> qwerty
> END
$ cat file
asdf
qwerty
$

不知道上述技巧是如何工作的。

cat &gt; file對我來說有點可以理解,這意味著 的輸出cat被重定向並寫入file.

這部分是如何&lt;&lt; "END"工作的?我至少假設這意味著字元串END應該被視為輸入cat- 因此,如果有的話,我會假設最後file應該只包含一行三個字母:END. 這意味著“接受來自控制台的輸入並將其重定向到,cat直到使用者鍵入此字元串,應將其視為分隔符”這怎麼可能是我無法理解的。

您的問題似乎不是here-documents 的工作方式,因為您已正確描述了它們在腳本文件中的使用。看來您不了解它們的互動用途。以下是一個(非常簡化的)速成課程,希望能為您澄清問題。

Shell 與一般的所有 Unix 程序一樣,具有用於來回讀取和寫入數據的輸入和輸出流。它們至少有一個輸入流(稱為stdin)和兩個輸出流(stdoutand stderr),但它們可以根據需要打開和關閉任意數量的讀取和寫入(主要是從文件讀取或寫入文件)。程序如何處理它們的流取決於它們。cat,例如,當不帶參數呼叫時,將其複製stdinstdout. Shell 通常將其輸入流解釋為要執行的命令(並根據某些語法為這些命令設置輸入和輸出流)。

輸入數據從何而來?它們可以來自發送它們的其他程序,可以從文件中讀取,也可以由使用者直接鍵入,這是 shell 最正常的情況stdin。在這種情況下,必須有另一個程序獲取使用者輸入並將其載入到流中。這樣的程序稱為 a ,tty在這種情況下,我們說流附加tty**到一個終端。tty

Shell 知道它們何時stdin附加到 atty並表現不同,例如在等待輸入時列印提示,但實際上並沒有太多其他差異。提示通常類似於user@host:current_path$. 它的確切內容可以通過改變變數來定義PS1。通常的約定是它以$您是普通使用者時結束,而#當您是root.

當您執行腳本時,shell 將輸入流附加到包含它的文件,並從中讀取命令。如果其中一個命令包含here-document,即類似於&lt;&lt;END,這意味著:從現在開始,直到僅包含此終止符的行,停止將流數據解釋為命令並將它們傳遞給stdin命令你將要執行(cat在你的情況下),可能會有一些現在不會打擾我們的修改。這是你已經知道的,儘管可能從另一個角度來看。

當輸入附加到 atty時,here-document 的含義相同:停止將流數據解釋為命令並將它們傳遞給stdin您要執行的命令,直到終止符。唯一不同的是,等待輸入時列印提示;這個提示與 shell 將在將輸入數據解釋為命令時列印的提示不同,只是為了讓您知道它們將被傳遞。它由變數定義PS2,其值預設為&gt;。在輸入 之後,您會在每一行的開頭看到它cat file &gt; file &lt;&lt; "END",直到讀取終止符,當 shell 恢復其正常行為時,列印它的PS1-prompt 並等待輸入被解釋為命令。

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