Shell

表達式 cat > foo << ‘wordofchoice’ 背後的邏輯是什麼

  • March 22, 2015

我知道 > 和 >> 運算符, > 通過刪除舊內容將某些內容放入文件中,>> 將某些內容附加到文件內容的末尾。

當我只使用

cat &gt; foo

我可以互動地在 foo 中寫幾行,直到我按下 ctrl+z,然後它才結束。

現在,如果我用我選擇的一些單詞以相反的順序添加附加運算符

cat &gt; foo &lt;&lt; "wordofchoice"

我可以像第一種情況那樣做,但是這次 > 提示出現在每行的開頭,我不能通過 ctrl+z 結束互動式輸入,而是鍵入“wordofchoice”(不帶雙引號)。

為什麼會這樣,這個表達式背後的邏輯是什麼, << 運算符似乎沒有它在這裡附加東西的意義。

  • $PS2
    • 每次使用者\n在互動式 shell 中完成命令行之前輸入 ewline,該變數的值應進行參數擴展並寫入標準錯誤。預設值為&gt;

您會看到,&gt;因為這是 - 的預設值,$PS2它是當 shell 無法正確分隔包含換行符的命令字元串時將列印的提示字元串。

您的命令字元串無法分隔,因為您沒有關閉帶引號的字元串:

  • 各種引用機制是轉義字元、單引號和雙引號。here-document 代表另一種引用形式;請參閱此處-文件

shell 的解析器在讀取輸入時對輸入進行標記- 逐行。您已經向它發送了一條\newline - 這也意味著您的終端到目前為止剛剛向它發送了命令的副本 - 但它檢測到至少一個開放式引號字元串 - 換句話說,一個不完整的命令 - 並提示您其餘的它的..

  • 如果目前字元是\反斜杠、'單引號或"雙引號並且它沒有被引用,它將影響到引用文本末尾的後續字元的引用。引用規則如引用中所述。在令牌辨識期間,不應實際執行替換,並且結果令牌應準確包含輸入中出現的字元*(除了\newline> 連接)*,未經修改,包括任何嵌入或封閉的引號或替換運算符,在\'"引號和引用文本的結尾。令牌不應由引用欄位的末尾分隔。

here-document 是一種特殊的引用形式,因為它也是一種重定向——shell 將您的輸入重定向為由打開標記&lt;&lt;heredoc_delimiter_string\n和預期的關閉標記分隔\nheredoc_delimiter_string\n的.command &lt;&lt;start_here_document

  • here-document 應被視為一個單詞,從下一個\newline 之後開始,一直持續到有一行只包含 the*&lt;&lt;delimiter和一個\newline,中間沒有空白*字元。然後下一個 here-document 開始,如果有的話。格式如下:

[n]&lt;&lt;word here-document delimiter

如果您送出任何其他 shell 令牌,該令牌暗示 shell 解析器的第二個,但在結束令牌之前將換行符交給它,那麼 shell 的行為將類似。$PS2例如,如果您在輸入ewline 或已經提到的其他引號之一之前for沒有輸入就開始循環。done``\n

\n在命令中添加 ewline 的另一種方法是用終端引用它 - 您通常可以用 . 直接引用下一個輸入字元CTRL+V。如果您這樣做CTRL+VCTRL+J \newline),您通常可以\n在命令字元串中輸入文字 ewline,而無需終端立即向 shell 發送您輸入的副本 - 因為通常終端會逐行發送它,但是當您CTRL+V 引用換行符時delimiter shell 還不會收到它,因此不會提示您輸入更多資訊。

然而,這並不意味著終端引用的換行符也被正確地引用到 shell - 你需要使用 shell 引號來執行此操作 - 但它至少會阻止命令字元串被讀取,直到你準備送出。

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