为什么我必须在此处文档中使用制表符而不是空格?

为什么我必须在此处文档中使用制表符而不是空格?

我个人使用 Windows 和 Linux 进行跨平台工作,有时我.sh使用 Notepad++ 编辑文件。因此,将所有文件的制表符缩进保持为 Unix 风格对我来说是有问题的,所以我的解决方案是使用基于空格的缩进。

然而,当我在heredocs中缩进herdocs时遇到了问题。例如,这是一个外部定界符,包含一个内部猫定界符:

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

我记得我在 bash 中使用类似 Unix 的制表符成功地运行了这个,但没有使用类似 Windows 的制表符,因为然后脚本崩溃了,使用空格也是如此。

我的问题:

我的问题实际上可以由这些问题组成,我问这个问题不仅是为了我自己,也是为了其他好奇的人找到这个:

  1. 为什么我们不能在其他此处文档中使用空格来缩进命令和此处文档?
  2. 如果我错了,并且有一种解决方法可以允许在其他此处文档中对命令和此处文档进行空格缩进,那么它是什么?

答案1

首先,不存在类 Unix 制表或类 Windows 制表之类的东西。 Windows 和 Unix 中的制表符是相同的。文本编辑器之间(而不是操作系统之间)可能发生的变化是 1. 当您按下 TAB 键时会发生什么,或者 2. 当编辑器遇到源代码中的制表符时会显示多少个空格。经验法则是将缩进设置为您喜欢的任何内容(空格数)并将制表保持为 8,但这是另一个争论。

现在,回到你的代码。问题是 EMW 分隔符。使用您的这种语法,EMW 行不能缩进(无论是空格还是制表符),它必须位于行的开头。否则,它会失去其定界符状态。

因此,一种解决方案可能是:

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 在解析定界文档时丢弃任何前导 TAB 字符。然后可以缩进分隔EMW符以及 的内容apache2.conf

相关内容