表達式 cat > foo << ‘wordofchoice’ 背後的邏輯是什麼
我知道 > 和 >> 運算符, > 通過刪除舊內容將某些內容放入文件中,>> 將某些內容附加到文件內容的末尾。
當我只使用
cat > foo
我可以互動地在 foo 中寫幾行,直到我按下 ctrl+z,然後它才結束。
現在,如果我用我選擇的一些單詞以相反的順序添加附加運算符
cat > foo << "wordofchoice"
我可以像第一種情況那樣做,但是這次 > 提示出現在每行的開頭,我不能通過 ctrl+z 結束互動式輸入,而是鍵入“wordofchoice”(不帶雙引號)。
為什麼會這樣,這個表達式背後的邏輯是什麼, << 運算符似乎沒有它在這裡附加東西的意義。
$PS2
- 每次使用者
\n
在互動式 shell 中完成命令行之前輸入 ewline,該變數的值應進行參數擴展並寫入標準錯誤。預設值為>
。您會看到,
>
因為這是 - 的預設值,$PS2
它是當 shell 無法正確分隔包含換行符的命令字元串時將列印的提示字元串。您的命令字元串無法分隔,因為您沒有關閉帶引號的字元串:
- 各種引用機制是轉義字元、單引號和雙引號。here-document 代表另一種引用形式;請參閱此處-文件。
shell 的解析器在讀取輸入時對輸入進行標記- 逐行。您已經向它發送了一條
\n
ewline - 這也意味著您的終端到目前為止剛剛向它發送了命令的副本 - 但它檢測到至少一個開放式引號字元串 - 換句話說,一個不完整的命令 - 並提示您其餘的它的..
- 如果目前字元是
\
反斜杠、'
單引號或"
雙引號並且它沒有被引用,它將影響到引用文本末尾的後續字元的引用。引用規則如引用中所述。在令牌辨識期間,不應實際執行替換,並且結果令牌應準確包含輸入中出現的字元*(除了\n
ewline> 連接)*,未經修改,包括任何嵌入或封閉的引號或替換運算符,在\'"
引號和引用文本的結尾。令牌不應由引用欄位的末尾分隔。here-document 是一種特殊的引用形式,因為它也是一種重定向——shell 將您的輸入重定向為由打開標記
<<heredoc_delimiter_string\n
和預期的關閉標記分隔\nheredoc_delimiter_string\n
的.command
<<start_here_document
- here-document 應被視為一個單詞,從下一個
\n
ewline 之後開始,一直持續到有一行只包含 the*<<delimiter
和一個\n
ewline,中間沒有空白*字元。然後下一個 here-document 開始,如果有的話。格式如下:
[n]<<word here-document delimiter
如果您送出任何其他 shell 令牌,該令牌暗示 shell 解析器的第二個,但在結束令牌之前將換行符交給它,那麼 shell 的行為將類似。
$PS2
例如,如果您在輸入ewline 或已經提到的其他引號之一之前for
沒有輸入就開始循環。done``\n
\n
在命令中添加 ewline 的另一種方法是用終端引用它 - 您通常可以用 . 直接引用下一個輸入字元CTRL+V
。如果您這樣做CTRL+V
(CTRL+J
或\n
ewline),您通常可以\n
在命令字元串中輸入文字 ewline,而無需終端立即向 shell 發送您輸入的副本 - 因為通常終端會逐行發送它,但是當您CTRL+V
引用換行符時delimiter shell 還不會收到它,因此不會提示您輸入更多資訊。然而,這並不意味著終端引用的換行符也被正確地引用到 shell - 你需要使用 shell 引號來執行此操作 - 但它至少會阻止命令字元串被讀取,直到你準備送出。