Windowsユーザなので、WSLやAmazon Linux上でシェルスクリプトを動かすときに百万回やっています。
1.改行コードとは
テキストファイルの各行の最後に存在する、コンピュータに改行することを伝える見えない記号のこと。エディタの設定で可視化することもできる。
Windows、Linux、Macで改行コードが違っているため、Windows上のエディタで書いたスクリプトをWSLなどで動かすと改行コードが理解できずエラーになってしまうことがある。
2.事象の再現
Windows 10 のメモ帳を開き、以下シェルスクリプトを作成する。
#!/bin/bash/
echo "Windows - newline code test"
WSLで実行すると、以下エラーになる。
$ bash windows_newline_code_test.bash
windows_newline_code_test.bash: line 2: $'\r': command not found
Windows - newline code test
これは Windows の改行コードCRLF
が使われているために発生するエラー。
3.改行コードについて
OS やバージョンによって改行コードが違う。
OS | 名称 | コード |
---|---|---|
Mac(OS 9 以前) | CR(Carriage Return) | \r |
unix | LF(Line Feed) | \n |
Windows | CR+LF(Carriage Return + Line Feed) | \r\n |
3-1.改行コードの確認
使用されている改行コードを調べるには file
コマンドを使用する。
file <textfile>
3-1-1.改行コードが LF の場合
$ file lf.txt
lf.txt: UTF-8 Unicode text
3-1-2.改行コードが CR+LF の場合
$ file crlf.txt
crlf.txt: UTF-8 Unicode text, with CRLF line terminators
4.改行コードの変換
4-1.nkf コマンドで変換
nkf
コマンドで改行コードの変換ができる。私はWSLで利用している Ubuntu にnkf
コマンドが未インストールだったので、以下コマンドでインストールした。
sudo apt install nkf
nkf
コマンドの詳細は以下を参照。
改行コードを LF
に変換するには nkf
コマンドの -Lu
(もしくは -d
) オプションを使用する。
# 「crlf.txt」の改行コードが CR+LF になっていることを確認する
$ file crlf.txt
crlf.txt: UTF-8 Unicode text, with CRLF line terminators
# 改行コードを LF に変換し、temp.txt に保存
$ nkf -Lu crlf.txt > temp.txt
# 「temp.txt」の改行コードが LF になっていることを確認する
$ file temp.txt
temp.txt: UTF-8 Unicode text
4-2.sed で改行コードを置換する
sed
で置換することもできる。
# 「crlf.txt」の改行コードが CR+LF になっていることを確認する
$ file crlf.txt
crlf.txt: UTF-8 Unicode text, with CRLF line terminators
# 改行コードを LF に変換する
$ sed -i -e 's/\r//g' crlf.txt
# 「crlf.txt」の改行コードが LF になっていることを確認する
$ file crlf.txt
crlf.txt: UTF-8 Unicode text
4-2.Visual Studio Code でデフォルト改行コードを変更する
Visual Studio Code(以下、VScode)を開き、[File] - [Preference]- [Settings]で設定画面に遷移する。
日本語なら[ファイル]-[ユーザ設定]-[設定]で設定画面に遷移できる。
検索バーで「eol」と検索すると、改行の設定「Eol項目」を見つけることができる。
デフォルトで「auto」になっている。今回はシェルスクリプトを作成したいので、\n
(LF)を選択する。
VScodeには設定の保存や反映させるボタンなどはなく、これで設定変更が反映されている。
新規ファイル作成すると、右下の改行コード表示が「LF」になっているのが確認できる。
右下の改行コード表示をクリックして、保存時の改行コードを選択することもできる。
4-2-1.改行コード変更済Visual Studio Code でシェルスクリプトを作成する
デフォルトの改行コードを変更したVScodeで、以下のようなシェルスクリプトを作成する。
#!/bin/bash/
echo "vscode_newline_code_test"
実行すると、エラーなく実行されるのが確認できる。
$ bash vscode_newline_code_test.sh
vscode_newline_code_test
参考