シェルスクリプトの改行コード

シェルスクリプトの改行コードはLFにします。
改行コードがCRLFだと実行できません。

管理人はそれを知らずにデバッグに時間を溶かしたので、メモとしてここに残しておきます。


“Hello, world!"と表示するだけのシェルスクリプトです。
これをWSL2上のUbuntu 22.04で実行してみます。

#!/bin/bash

echo "Hello, world!"

改行コードがLFのもの(echo_lf.sh)とCRLFのもの(echo_crlf.sh)を用意します。

$ file echo_lf.sh
echo_lf.sh: Bourne-Again shell script, ASCII text executable
$ file echo_crlf.sh
echo_crlf.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

それぞれ実行してみます。

$ ./echo_lf.sh
Hello, world!
$ ./echo_crlf.sh
-bash: ./echo_crlf.sh: /bin/bash^M: bad interpreter: No such file or directory

改行コードがCRLFのものはエラーとなることがわかります。

nkfコマンドを使うと簡単に改行コードを変換することができます。

$ nkf -Lu echo_crlf.sh >echo_lf.sh
$ file echo_lf.sh
echo_lf.sh: Bourne-Again shell script, ASCII text executable

Linux環境でシェルスクリプトの作成から実行まで完結するならこういう問題は起きませんが、管理人の場合はWindowsのWSL上にインストールしたLinux環境を使っていたので、改行コードの問題が起きました。
Windows側で編集したシェルスクリプトの改行コードがCRLFになっていたため、Linux側で実行しようとしたときにエラーが発生した、という流れです。

管理人が最初に試した環境だとエラーメッセージがNo such file or directoryしか表示されなくて、ファイルはあるのになんでや…ってなりました。


参考になったStack Overflowの回答: https://stackoverflow.com/a/32735827/12946525

Linux

Posted by 駄場さん