このbash
スクリプトは破損しているようです。
#!/bin/bash
echo "It prints ok"
cat << 'EOF' > ~/doFoo.sh
echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
echo 'nested script doing Bar'
EOF
echo "It never prints too"
# Here there is no doFoo.sh or doBar.sh in ~
ls -l ~/doFoo.sh ~/doBar.sh
スクリプトは最初のメッセージ(It prints ok
)のみを印刷し、doFoo.sh'$'\r'
次の名前のファイルを生成します。
echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
echo 'nested script doing Bar'
EOF
echo "It never prints too"
# Here there is no doFoo.sh or doBar.sh in ~
@Jim L. その行を追加した後でも、正確な出力は次のようになります。
It prints ok
それはすべてです。
ベストアンサー1
Windowsシステムでスクリプトを作成し、エディタを使用してDOSテキストファイルとして保存します。コメントによると、nano
Unixシステムで何度も編集を行ったという。 Unix(nano
含む)のほとんどのテキストエディタは、テキストファイルがDOS形式であることを確認し、後でファイルを保存するときにこの形式を維持します。たとえば、nano
エディタを使用または実行すると、常にUnixテキスト形式で保存されます。-u
--unix
DOSテキストファイルには「crlf」(キャリッジリターン+改行)の改行文字があり、Unixテキストファイルには「lf」(改行)の改行文字があるため、Unixツールで読むときに各行に最後にキャリッジリターン文字があります(表示されていませんが、一般的またはエンコード^M
されています\r
)。これらのキャリッジリターンはスクリプトのコマンドを妨げます。
たとえば、これはシェルがEOF
最初のhereドキュメントの終わりを見つけるのを防ぎます。実際にEOF\r
いいえ、いいえと言ってくださいEOF
。
cat -v
スクリプトで使用すると、キャリッジリターンが表示されます。
$ cat -v script
#!/bin/bash^M
echo "It prints ok"^M
cat << 'EOF' > ~/doFoo.sh^M
echo 'nested script doing Foo'^M
EOF^M
echo "It never prints"^M
cat << 'EOF' > ~/doBar.sh^M
echo 'nested script doing Bar'^M
EOF^M
echo "It never prints too"^M
# Here there is no doFoo.sh or doBar.sh in ~^M
Unixを使用してスクリプトファイルをUnixスクリプトファイルに変換すると、問題を解決したり、上記のように使用またはdos2unix
実行した後にテキストを保存したりできます。nano
nano
-u
--unix
$ dos2unix script
dos2unix: converting file script to Unix format...
$ cat -v script
#!/bin/bash
echo "It prints ok"
cat << 'EOF' > ~/doFoo.sh
echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
echo 'nested script doing Bar'
EOF
echo "It never prints too"
# Here there is no doFoo.sh or doBar.sh in ~