次のコードは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文書にインデントする正しい方法は何ですか?
メモ:
私はまた、審美的な理由で他のコマンドと同様に内部heredocをインデントするのが好きです。これにより、スクリプトを読みやすく簡単に構成できます。
この質問は「入れ子になったインデントと一致するように区切り文字をインデントすることはできません。「外部励起文書自体をインデントするのではなく、外部励起文書内で内部励起文書をインデントする正しい方法を尋ねるからです。
答え1
ここに文書化された内容は、次の形式のリダイレクトです。
<<[-]DELIMITER
....
....
....
DELIMITER
オプションで-
(上記の括弧で)区切り文字の一致方法を変更し、タブを使用して文書の内容内の各行を区切るためのインデントを許可します(スペースは許可されていません)。
「一致」は、区切り文字が開始文字と一致することを意味します(たとえば、
DELIMITER
一致する場合)。<<DELIMITER
<<-DELIMITER
<<
<<-
次の単語の間には1つ以上のスペースを使用できます。
単一のクリーンアップ内でマッチングの基本ルールを要約すると、次のようになります。
- びんを離す必要があります最初にその構文の行。
- 区切り文字は次のようになります。唯一の言葉そのライン。
- 開いている文字(区切り文字を含む)の下のすべての内容は、必要に応じてインデントできます。シート、そして
<<-DELIMITER
文法。
以前の構文を使用すると、heredocの先頭にスペースを入れないでください。インデントするには、唯一のオプションは次の構文を使用することです。そして、heredocコンテンツ内の各行の先頭にタブを具体的に使用する必要があります。 。
2つの構文オプションがあります<<-
。
最初のオプション
<<-
内部で区切られた文書の構文を使用してください。
bash << APACHE
...
...
cat <<- MOD_REWRITE
⇨ ...
⇨ ....
⇨ MOD_REWRITE
...
...
APACHE
(インデントはスペース4つ、表は記号で表現⇨
)
あなたが見るコードはbash
画面に書かれているのと同じです(つまり、bash
今見ているように、各行がインデントされていることがわかります)。内部区切り文字が満たされると、各行の先頭のタブ文字は構文<<-
上の理由でbash
MOD_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'
リダイレクトによって削除されるタブ文字の後にある各行を使用してインデントできます。