Windows で編集された Bash/Korn シェルスクリプトで「...^M: 見つかりません」エラーが発生します。

Windows で編集された Bash/Korn シェルスクリプトで「...^M: 見つかりません」エラーが発生します。

私はNotepad ++を使ってWindowsでBashスクリプトを書いた。

cxStopAllServicesOnSERVER.sh

#!/usr/bin/bash
cd "/some/path"
echo "Hi. Logs can be found at "`pwd`"/cxStartStopLogger.log"
echo "["`date`"]*** STOPPING ALL SERVICES ON SERVER ***" >> "cxStartStopLogger.log"
exit

アップロードして必要なファイル権限を設定したら、次のように実行してみます。

bash-3.00$ cat cxStopAllServicesOnSERVER.sh #Let's have a look at the code.
#!/usr/bin/bash
cd "/some/path/"
echo "Hi. Logs can be found at "`pwd`"/cxStartStopLogger.log"
echo "["`date`"]*** STOPPING ALL SERVICES ON SERVER ***" >> "cxStartStopLogger.log"

bash-3.00$ # Code and hashbang 'looks' correct, 
bash-3.00$ # if there is any issue with the format (EOL characters and such) 
bash-3.00$ # we cannot see it using cat.
bash-3.00$ 
bash-3.00$ sh cxStopAllServicesOnSERVER.sh
cxStopAllServicesOnSERVER.sh[2]: /some/path^M:  not found
Hi. Logs can be found at /some/path/cxStartStopLogger.log
bash-3.00$ # Note that ^M appears at the end of the line.

bash-3.00$ bash -x cxStopAllServicesOnSERVER.sh
+ cd $'/some/path\r'
: No such file or directory1.sh: line 2: cd: /some/path
++ pwd
' echo 'Hi. Logs can be found at /some/path/cxStartStopLogger.log
Hi. Logs can be found at /some/path/cxStartStopLogger.log
++ date
+ echo '[Sun' Nov 18 00:28:17 EST '2012]*** STOPPING ALL SERVICES ON SERVER ***'
bash-3.00$ # Note that '\r' return character appears at the end of the line.

質問: コードをkornシェルに変更したときも同じ問題に直面しました。行末に誤った文字が追加されたようです。

メモ: 解決策を見つけ、答えと同じ内容を投稿しました。同じ問題に直面する他の初心者に役立つように、自由に更新または改善してください。ありがとうございます!

ベストアンサー1

さまざまなフォーラムとスタックオーバーフローの投稿を検索した後、この問題が見つかりました。

以下は、エラーの根本原因をよりよく理解し、「確認」するための説明です。

まず、Windowsでコーディングする場合は、Notepad ++で武装することをお勧めします。私の考えでは、基本的にテキストエディタのスイス軍用ナイフです。

EOL(行末)文字やその他の制御記号を表示するには、次の手順を実行します。

1. Notepad++ でファイルを開きます。

メニューバーで、表示/記号の表示/すべての文字の表示を選択します。

これで、次の記号が表示されます。 Notepad++スクリーンショット:WindowsでUNIXスクリプトを編集する

ああ! Windows / MS-DOSでは、CR + LFを使用して行末を示します。 UNIXでは、LF文字を使用して行末文字(EOL文字)を表します。

2.1。 Windows EOLをUNIX EOLに変換してみましょう。

編集/EOL変換/UNIX形式を選択します。

次の内容が表示されます。

Notepad++スクリーンショット:EOLからUNIX形式へ これは、行の末尾に「\ r」文字が追加される理由を説明します。これは、UNIXが「\n」またはLF(改行)を行出口/ EOL文字として認識しますが、「\ r」または^ M(キャリッジリターン)文字を無視するためです。

EOLの問題をテストすることもできます。

bash-3.00$ head myScript.sh | cat -vet | head -1
#usr/bin/bash^M$
bash-3.00$ #We see that ^M, that is \r is found at the end of each line. 

2.2. WindowsでUNIXからUNIX EOL形式にファイルを変換する場合は、この問題を解決する2つの方法があります。

$ dos2unix myScript.sh

または

提供されたソリューションを使用してください@クリスダウン次のように:

$ sed -i 's/\r$//' myScript.sh

引用:

  1. 詳しくは行が終了しました そして rとnの違いは何ですかこのリンクを参照してください。

おすすめ記事