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 ~

答え2

問題の説明は、ファイルを探したいことを意味します。

doFoo.sh
doBar.sh

ホームディレクトリにあります。あなたのスクリプトはこれらの名前を使用しません。catスクリプトのコマンドで指定されているように、各名前の前にドットを追加して、探しているファイルを見つけることができます。

$ cd ~
$ ls -l .do*
-rw-------  1 jim  jim  39 Mar 15 14:49 .doBar.sh
-rw-------  1 jim  jim  39 Mar 15 14:49 .doFoo.sh
$ cat .doBar.sh
    echo 'nested script doing Bar'
$ cat .doFoo.sh
    echo 'nested script doing Foo'

編集する:

echo最初のステートメントのみが実行され、スクリプトは最初のステートメントでcat失敗することを示します。ただし、公開したスクリプトはマイコンピュータで動作します。ファイルに構文エラーが発生するが、StackExchange ポストには表示されない印刷できない/ジャンク文字が含まれている可能性があります。

上記のようにスクリプトを正確にコピーして貼り付けて、次の場所に保存してみてください。新しい文書:

cat << END > newfile.sh
(paste)
END
chmod +x newfile.sh
./newfile.sh

関連情報