
この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 ~
答え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