Windows -> Linux は改行コードに注意!!


そもそも改行コードとは?

こんにちは!バイオインフォマティクス系オタク修士学生のroadricefieldです!今日は改行コードのお話です. みなさんのプログラムを書いたファイルなどのテキストファイルの各行の最後には実は改行コード呼ばれる見えない文字が書かれています. (エディタ側で設定することで可視化することもできます.)コンピュータに改行することを伝える記号なのですがWindowsとLinux, Macで改行コードが違います. このためWindows上のエディタで書いたスクリプトをWSLで動かすと改行コードを理解できなくてエラーを吐いて止まってしまうということがよくあります. ちょっとやってみましょう.

WindowsでVScodeを開いて新規ファイルを作成して以下のようなshell script, windows.shを書きます.

windows.sh
#!/bin/sh
echo "Hello world!!"

ではこれをWSLで実行してみて下さい.

$ bash windows.sh

すると多くの人が以下のように怒られたのではないでしょうか.

windows.sh: line 2: $'\r': command not found

このメッセージが出た人はwindows.shをVScodeでもう一度開いてVScodeのウィンドウの右下を確認してみてください.

このように"CRLF"と表示されていますよね. この"CRLF"はWindowsの改行コードの名前でこのwindows.shで改行コードに"CRLF"が使われていることを示しています.

今回はエラーメッセージの下に一応Hello world!!と表示されていると思いますがもっと複雑なスクリプトの場合は処理が正常に実行されません.

Windowsの改行コードをLinuxの改行コードに置換する方法

1. VScodeで保存するときの文字コードを変更する

さきほどの"CRLF"と書いてあった部分をクリックすると中央最上部にSelect End of Line Sequenceという選択肢が出てきますのでここでLinuxの文字コードである"LF"を選択してスクリプトを保存して下さい. これだけです! これでもう怒られません.
ちなみに改行コードの表示の左に"UTF-8"と文字コードの表示もありますがここで文字コードの変更もできますので日本語で書かれたコメントなどが文字化けしているときはこれをクリックしてReopen with Encodingを選択して次にJapanese (Shift JIS)を選択すると読めるようになると思います.

2. sedコマンドで文字コードを置換する

sedコマンドで置換することもできます. (参考

$ sed -i -e 's/\r//g' windows.sh

さいごに

改行コード問題は「Windowsで編集したスクリプトをサーバーで実行したら意味のわからないエラーが出た!」といったときに起きていることが多いです. そういうときは落ち着いてVScodeの右下を確認してみましょう. (Windowsのメモ帳など他のエディタでも多くの場合右下に改行コードの表示があると思います.)