区切り文書内で区切られた文書を正しい方法でインデントする方法は?

区切り文書内で区切られた文書を正しい方法でインデントする方法は?

次のコードはApacheをインストールするためのスクリプトです。スクリプトをラップするHeredocブロック(APACHE)で実行されると、スクリプトはその場で実行されます。

このAPACHE here文書には、「補助」または「内部」here文書と呼ばれる内部here文書(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'

私の質問:

スクリプトがより均一で実行中に中断されないように、MOD_REWRITE here文書をAPACHE here文書にインデントする正しい方法は何ですか?

メモ:

答え1

ここに文書化された内容は、次の形式のリダイレクトです。

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

オプションで-(上記の括弧で)区切り文字の一致方法を変更し、タブを使用して文書の内容内の各行を区切るためのインデントを許可します(スペースは許可されていません)。

  • 「一致」は、区切り文字が開始文字と一致することを意味します(たとえば、DELIMITER一致する場合)。<<DELIMITER<<-DELIMITER

  • <<<<-次の単語の間には1つ以上のスペースを使用できます。

単一のクリーンアップ内でマッチングの基本ルールを要約すると、次のようになります。

  1. びんを離す必要があります最初にその構文の行。
  2. 区切り文字は次のようになります。唯一の言葉そのライン。
  3. 開いている文字(区切り文字を含む)の下のすべての内容は、必要に応じてインデントできます。シート、そして<<-DELIMITER文法。

以前の構文を使用すると、heredocの先頭にスペースを入れないでください。インデントするには、唯一のオプションは次の構文を使用することです。そして、heredocコンテンツ内の各行の先頭にタブを具体的に使用する必要があります。 。

2つの構文オプションがあります<<-

最初のオプション

<<-内部で区切られた文書の構文を使用してください。

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

(インデントはスペース4つ、表は記号で表現

あなたが見るコードはbash画面に書かれているのと同じです(つまり、bash今見ているように、各行がインデントされていることがわかります)。内部区切り文字が満たされると、各行の先頭のタブ文字は構文<<-上の理由でbashMOD_REWRITE 区切り文字まで削除されます。

2番目のオプション

<<-外部区切り文字を使用する構文。

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

今回表示されるコードは、bashこのコードとは異なります。先行テーブルは含まれません。これが内部で区切られた文書の構文を使用するときにこれが問題にならない理由です<<。 MOD_REWRITE 区切り文字は行の先頭にあります。

どちらの場合も、MOD_REWRITE区切り文字が認識され、Apache設定ファイルはインデント/etc/apache2/apache2.confされません。一部をインデントするには、スペースを使用することが唯一のオプションです(削除される最初のテーブルの後に)。

もちろん、3番目のオプションもあります。<<-両方の文書に構文を使用することです。しかし、コードが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'リダイレクトによって削除されるタブ文字の後にある各行を使用してインデントできます。

関連情報