Here-Document

為什麼我必須在 heredocs 中使用製表符而不是空格?

  • March 22, 2017

我個人使用 Windows 和 Linux 跨平台工作,有時我.sh使用 Notepad++ 編輯文件。因此,將所有文件的製表符縮進保持為類 Unix 對我來說是有問題的,因此我的解決方案是使用基於空格的縮進。

然而,我在 heredocs 中縮進 herdocs 時遇到了問題。例如,這是一個外部的heredoc,持有一個內部的catheredoc:

bash /dev/fd/10 10<<-'EOT'
   Some command.
   cat << EMW >> /etc/apache2/apache2.conf
   EMW
   Some other command.
EOT

正如我回憶的那樣,我在 bash 中使用類似 Unix 的製表符成功地執行了這個,但沒有使用類似 Windows 的製表符,因為腳本中斷了,使用空格也是如此。

我的問題:

我的問題實際上可以由這些問題組成,我不僅要問我,還要問其他好奇的人:

  1. 為什麼我們不能在其他 heredocs 中使用空格來縮進命令和 heredocs?
  2. 如果我錯了,並且有一種解決方法允許在其他 heredocs 中對命令和 heredocs 進行空格縮進,那麼它是什麼?

首先,不存在類 Unix 製表或類 Windows 製表之類的東西。製表符在 Windows 和 Unix 中是相同的。文本編輯器(而不是作業系統)之間可能發生的變化是 1. 當您按下 TAB 鍵時會發生什麼或 2. 當編輯器遇到原始碼中的製表符時會顯示多少個空格。經驗法則是將縮進設置為您喜歡的任何內容(空格數)並將製表保持為 8,但這是另一個爭論。

現在,回到你的程式碼。問題是 EMW 分隔符。使用您的這種語法,EMW 行不能縮進(無論是空格還是製表符),它必須在行首。否則,它將失去其heredoc 分隔符狀態。

因此,一種解決方案可能是:

bash /dev/fd/10 10<<'EOT'
   Some command.
   cat << EMW >> /etc/apache2/apache2.conf
....
....
EMW
   Some other command.
EOT

另請注意,apache2.conf(上面用 符號表示....)的內容不能縮進,否則也會縮進apache2.conf

如果要縮進整個 bash 程式碼,請改用以下語法:

bash /dev/fd/10 10<<-'EOT'
       Some command.
       cat << EMW >> /etc/apache2/apache2.conf
       ....
       ....
       EMW
       Some other command.
EOT

這裡,用於縮進的前導空格由任意數量的 TAB 字元組成(TAB,不是空格!)

我改變了什麼?我10<<'EOT'改為10<<-'EOT'. 這種特殊語法要求 bash 在解析heredoc 時丟棄任何前導TAB 字元。然後EMW可以縮進分隔符,以及apache2.conf.

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