LinuxとEmacsでシェルクスクリプトを書いていた時は問題なく実行できていたのに、WindowsとCygwin、NTEmacsでシェルスクリプトを書いてみるとコマンドが見つからないとエラーが表示される問題にぶつかりました。
コマンドが見つからない
“pwd”とだけ記述した単純なシェルスクリプトを実行してみた際の実行結果です。
irail@DESKTOP-DIFP7S3 ~/OneDrive/ドキュメント/Samples $ sh script_by_ntemacs.sh script_by_ntemacs.sh: 行 1: $'pwd\r': コマンドが見つかりません
シェルスクリプトを実行するも、コマンドが見つかりませんとエラーが表示されます。
どうもコマンドの後ろに余分な情報が邪魔をしている様子です。
シェルスクリプトの比較
今までシェルスクリプトを作成していた環境で同様のファイルを作成して比較してみました。
$ file * // Linuxの設定未変更Emacsで作成 script_by_init_emacs.sh: ASCII text // Windowsのメモ帳でutf-8で保存 script_by_notepad.sh: UTF-8 Unicode (with BOM) text, with no line terminators // 設定変更済みNTEmacsで作成 script_by_ntemacs.sh: ASCII text, with CRLF line terminators
LinuxのEmacsとWindowsのメモ帳では文字コードが違えど改行文字が確認できません。
対して、問題の設定変更済みNTEmacsでは改行をしていないのにもかかわらず、Windows向けの改行文字が存在していることが分かりました。
実際にNTEmacsで作成したスクリプトファイルを開いてみると、存在しないはずの2行目が存在していました。
Emacsの特殊な設定
詳しくはよくわかりませんでしたが、どうもEmacs側でファイルの終端に自動で改行を挿入する設定が適用されているようです。
普段はファイルの終端に改行文字を自動挿入してくれたほうが嬉しい場面のほうが多いので、とりあえずデフォルトの設定は変更しないことにしました。
シェルスクリプトなどファイル終端の改行が不要な時に必要に応じて
M-x eval-expression (setq require-final-newline nil)
上記のコマンドで開いているバッファに対してのみ、ファイル終端の改行文字の自動挿入を無効化する設定を適用していく感じで行こうと思います。
それにしてもこちらで編集したEmacsの設定ファイルには、この類の設定は明示していないのにどうして設定が適用されているのか。
標準で適用されている設定?
それとも利用している設定のどれかが影響しているのでしょうか?