次のシェルスクリプトがあるとします。
#!/bin/bash \n
echo "Hello World" \n
実行すると
Hello world.
ここで、次のシェルスクリプトがあるとします。
#!/bin/bash \r\n
echo "Hello world" \r\n
実行すると、次の結果が表示されます。
bad interpreter: No such file or directory
初心者の場合 - これは実際に問題の原因を指していません(原因が空白であると仮定)。あなたが本当に欲しいのは、問題が何であるかを示すエラーです。
私の質問は次のとおりですWindows行の終わりを含むファイルに関するエラーを提供するようにbashを取得するにはどうすればよいですか?
編集する:
ここでの文脈は、誰かがファイルを見て行末を見ることができず、意図せずにこのようなことが発生したということです。 UnixのテキストファイルとWindowsのテキストファイルの違いについて質問したとき、彼らは「どういう意味ですか?それはプレーンテキストですか?」と答えました。この質問は、ユーザーに問題の根本的な原因を確認するように促すことです。
答え1
問題は、bashが実行される前にエラーが発生することです。
#!
then で始まるスクリプトを実行すると、コア残りの行を調べて、ファイル名を最初の引数として使用して実行します。したがって、DOS形式のファイルがある場合、カーネルはそれを見て/bin/bash^M
プログラムとして実行しようとします。もちろん、これは存在しません。
少し狂ってみたいならできる/bin/bash^M
というプログラムを作ってみてください。
$ ls -lb /bin/bash?
-rwxr-xr-x 1 root root 61 Jun 18 22:41 /bin/bash\r
$ cat /bin/bash?
#!/bin/sh
echo Convert your program to Unix format!
exit 255
$ file foo
foo: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
$ cat -v foo
#!/bin/bash^M
echo hello^M
$ ./foo
Convert your program to Unix format!
$ dos2unix foo
dos2unix: converting file foo to Unix format ...
$ ./foo
hello
それでもこれをお勧めするかどうかはわかりません!
file
代わりに、トレーニングと診断「ランチャー」(例:CRLF行終了者を報告するためのコマンド)をお勧めします。