Bashはこの文書をファイルに出力しません。

Bashはこの文書をファイルに出力しません。

この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テキストファイルとして保存します。コメントによると、nanoUnixシステムで何度も編集を行ったという。 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実行した後にテキストを保存したりできます。nanonano-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 ~

おすすめ記事