cat heredocument は、関数呼び出しを除くすべてをコピーします。

cat heredocument は、関数呼び出しを除くすべてをコピーします。

Ubuntu 16.04環境のBashコンソールで次のコードを実行しました。

cat <<-'DWA' > /opt/dwa.sh
    DWA() {
        test='test'
        read domain
        find /var/www/html/ -exec cp /var/www/html/${domain} /var/www/html/${test} {} \;
        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php
        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php
        mysql -u root -p << MYSQL
            create user '${test}'@'localhost' identified by '${psw}';
            create database ${test};
            GRANT ALL PRIVILEGES ON ${test}.* TO ${test}@localhost;
        MYSQL
    }
    DWA
DWA

最後の行のコード(関数呼び出しとして使用されます)をDWA除いて、すべてが必要な方法でリダイレクトされます。

最後のDWA関数呼び出しを除くすべての項目がコピーされますが、このストリームのみがコピーされないのはなぜですか?

DWA前の記事と衝突があるのではないでしょうか?

ベストアンサー1

最後の項目はDWA区切り文字として使用されるため削除されます。区切り文字は、一致する文字列間のすべての内容が私のここのドキュメントの一部であることをシェルに伝えます。区切り文字は文書の一部ではないため、ここから文書を読み取ると削除されます。 beforeを維持する理由はDWA、区切り文字が行の先頭になければならないからです。私は一般に人々がEOForを使用しているのを見ますが、EOLこの文字列は一意で文書に表示されない限り、あなたが望む文字列にすることができます。

次のように変更することをお勧めします。

cat <<-'EOF' > /opt/dwa.sh
    #!/bin/bash
    DWA() {
        test='test'
        read domain
        find /var/www/html/${domain} -exec cp /var/www/html/${domain} /var/www/html/${test} {} \;

        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php
        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php

        mysql -u root -p << MYSQL
            create user '${test}'@'localhost' identified by '${psw}';
            create database ${test};
            GRANT ALL PRIVILEGES ON ${test}.* TO ${test}@localhost;
        MYSQL
    }
    DWA
EOF

これらの変数が転送される前に拡張されることを本当に望む場合は、逆dwa.sh参照する必要があります。EOF

私はこのページがここにあるドキュメントの非常にきれいなリソースであることを知りました。 http://tldp.org/LDP/abs/html/here-docs.html

おすすめ記事