【シェルスクリプト】$’\r’: command not foundと表示される原因と対処法

定期的に同じトラップにはまるので、いい加減忘れないよう備忘録です。

現象

こんな感じで絶対に動きそうなシェルスクリプトがあります。

#!/bin/bash

echo "hogehoge"

でも実際に実行してみると以下のようなよくわからないエラーが表示されます。

$ bash hoge.sh
hoge.sh: line 2: $'\r': command not found
hogehoge

2行目が原因のエラーらしいですが、そもそも2行目は空行なんですが・・・

原因

改行コードがLinuxの\nではなく、Windowsの\r\nになっていることが原因です。

Linuxだと\n単体で改行コード認定されてしまうので、\rはコマンドとみなされちゃってエラーになるみたいです。

対処法

改行コードを\r\nから\nに変換すれば無事実行できるようになります。変換はこのコマンドで実行できます。

$ dos2unix hoge.sh

このコマンドのインストール方法やそもそもの改行コードの確認法は以下の記事を参考にしてください。

変更後はエラーなくシェルスクリプトの実行できました。

$ bash hoge.sh 
hogehoge

WindowsとMacの開発者が混在しているような環境だとこういう現象稀によくあって、しかも目に見えるコードは問題ないので対処法知らないと地味に時間かかったりして地味に困る。。。

なお、シェルスクリプトだけでなくシェルスクリプトで読み込むファイルとかも改行コードが違うと動かないことがあるので気をつけましょう。

コメント