如何以正确的方式在定界文档内缩进定界文档?

如何以正确的方式在定界文档内缩进定界文档?

以下代码是用于安装 Apache 的脚本。当从包装它的 Heredoc 块(APACHE)执行该脚本时,我就地运行该脚本。

请注意,在这个 APACHE 此处文档中,我有一个内部此处文档 (MOD_REWRITE),我可以将其称为“辅助”或“内部”此处文档。

另请注意,除了内部定界文档的代码之外,APACHE 内的所有代码都是缩进的(表格)。

bash /dev/fd/10 10<<'APACHE'

    # Setup basics:

    apt-get update -y && apt-get upgrade -y
    apt-get install tree zip unzip
    a2enmod mcrypt && a2enmod mbstring

    # Setup LAMP environment with enabled mod rewrite:

    echo -e "\07" && echo -e "\077" # Insert password.
    apt-get install lamp-server^ -y
    a2enmod rewrite

cat <<MOD_REWRITE >> /etc/apache2/apache2.conf

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
MOD_REWRITE

    systemctl restart apache2.service

    # Setup maldet:

    cd /usr/local/src
    wget http://www.rfxn.com/downloads/maldetect-current.tar.gz && tar -xzf maldetect-current.tar.gz
    cd maldetect-* && bash ./install.sh

APACHE

如果我使用带有空格而不是制表符的命令缩进它,我可以很好地运行脚本(只要它里面没有 MOD_REWRITE )。如果我添加 MOD_REWRITE,脚本在执行时会停止;如果我删除所有空格缩进并将它们完全替换为表格,也会发生同样的情况,但是据我所知,上次我尝试使用表格执行脚本时,它也损坏了(即使我在之间添加了连字符)bash /dev/fd/10 10<< 'APACHE'

我的问题:

在 APACHE 此处文档中缩进 MOD_REWRITE 此处文档的正确方法是什么,以便脚本更加统一并且执行时不会损坏?

笔记:

  • 我也想缩进内部heredocs,就像我对任何其他命令所做的那样,是出于美学原因——它使我更容易阅读和组织我的脚本。

  • 这个问题与“无法缩进定界符以匹配嵌套的缩进“因为它询问在外部此处文档内缩进内部此处文档的正确方法,而不是缩进外部此处文档本身。

答案1

此处文档是以下形式的重定向:

<<[-]DELIMITER
    ....
    ....
    ....
DELIMITER

可选-(在上面的括号内)更改分隔符的匹配方式,并允许缩进定界文档内容内的每一行,并带有制表符(不允许空格)。

  • “匹配”意味着分隔符与开头符匹配(例如,当DELIMITER匹配<<DELIMITER或 时<<-DELIMITER)。

  • <<请注意,您可以在或<<-以及后面的单词之间使用一个或多个空格)。

总结一下单一定理内匹配的基本法则:

  1. 开瓶器必须放置在一开始适用语法中的行。
  2. 分隔符必须是唯一的词其行。
  3. 开头符下的所有内容(包括分隔符)都可以缩进任意数量的表格,与<<-DELIMITER语法。

由于使用前一种语法,heredoc 开头不能有空格,如果您想缩进它,您唯一的选择是使用以下语法,并且必须在heredoc 内容内的每行开头专门使用制表符。

现在您有两种语法选择<<-

第一个选项

使用<<-内部定界文档的语法。

bash << APACHE
    ... 
    ... 
    cat <<- MOD_REWRITE
⇨       ...     
⇨       ....    
⇨       MOD_REWRITE
    ... 
    ... 
APACHE

(缩进为4个空格,表格用 符号表示

所看到的代码bash将与屏幕上所写的完全相同(即,bash将看到每行的缩进,就像您现在看到的那样)。当满足内部定界符时,由于<<-语法的原因,bash将去除每行开头的制表符,直到 MOD_REWRITE 分隔符。

第二个选择

使用<<-外部定界符的语法。

bash <<- APACHE
⇨       ...
⇨       ...
⇨       cat << MOD_REWRITE
⇨       ⇨       ...
⇨       ⇨       ....
⇨       MOD_REWRITE
⇨       ...
⇨       ...
APACHE

这次,看到的代码bash将与您看到的有所不同:它不会包含任何前导表格。这就是为什么我使用内部定界文档的语法时这不是问题<<:MOD_REWRITE 分隔符将位于行的开头。

在这两种情况下,都会识别 MOD_REWRITE 分隔符,并且您的 Apache 配置文件/etc/apache2/apache2.conf不会缩进。如果您想缩进其中的一部分,唯一的选择是使用空格(在将被删除的初始表格之后)。

当然,还有第三种选择:<<-对这两个文档使用语法,但这不会改变选项 2 的任何内容,因为当代码发送到bash.

答案2

首先,缩进该cat行和后续行(带有终止符的行除外NGINX)应该可以。文档中的前导缩进将保留在输出中,这在您的情况下可能是也可能不是问题(如果输出确实是 HTML,则引入额外的空格可能并不重要)。

另外,Bash 文档是这样说的:

The format of here-documents is:

       <<[-]word
               here-document
       delimiter

[...]

If the redirection operator is <<-, then all leading tab characters are
stripped from input lines and  the  line  containing  delimiter.   This
allows  here-documents within shell scripts to be indented in a natural
fashion.

因此,您可以使用<<-'PHP_FPM'并缩进制表符后面的每一行,这将被重定向删除。

相关内容