改行コード(CR/LF)の調整
改行コード(CR/LF)の調整
nkfコマンドはUnix形式(LF, 0A)とWindows形式(CRLF, 0D0A)の改行コードを相互変換する機能を持つ。シェルスクリプトがCRLF形式で動作しない主な原因は、インタプリタ指定行などに不要なCRが付加されるためである。cat -v -Aコマンドで改行コードを確認でき、Ubuntu 24.04 LTSではaptコマンドでnkfをインストール可能である。
コンピュータにおける改行コードは、テキストファイルにおいて行の終わりを示す特殊な制御文字である。主にUnix/Linux系OSではLine Feed (LF) が標準であり、16進数では「0A」で表現される。一方、Windows OSではCarriage Return + Line Feed (CRLF) の組み合わせが標準であり、16進数では「0D0A」で表現される。OS間でテキストファイルをやり取りする際、この改行コードの違いが問題となることがある。特にシェルスクリプトや設定ファイルなど、OSが直接解釈するテキストファイルでは、CRLF形式のファイルが正しく認識されず、予期しないエラーの原因となる場合がある。
nkf(Network Kanji Filter)は、日本語の文字コード変換ツールとして広く知られているが、テキストファイルのエンコーディングと改行コードを包括的に処理できるユーティリティでもあり、Unix 形式の改行コード (LF) と,Windows 形式の改行コード (CRLF) の相互変換を簡単に行うことができる。
unix 形式の改行コード (LF) から Windows 形式の改行コード (CRLF) への変換
nkf -Lw hoge.sh > hoge2.sh
ここで使用している -Lw
オプションは、nkfに対して入力ファイルを読み込み、改行コードをWindows形式 (CRLF) に変換して出力することを指定している。
◇ 変換元となるシェルスクリプト hoge.sh
の中身を次のように作成する。LF形式であることを想定する。
#!/bin/bash
echo "Hello, world!"
◇ LF形式で作成した hoge.sh
を Windows 形式の改行コード (CRLF) に変換すると、シェルスクリプトとして機能しないことがある。これは、CRLF形式では行末にLFだけでなくCR(\r)も付加されるため、特にインタプリタ指定行である #!/bin/bash
の末尾に不要なCR(\r)が付いてしまい、シェルが正しいインタプリタとして認識できないなどの問題が発生するためである。
* Ubuntu での実行例

(上記は実行例のスクリーンショットであるが、以下に具体的なコマンドと出力をテキストで示す。ファイルの内容確認には cat -v -A
コマンドを用いると、LFを $
で、CRを ^M
で表示できる。)
# 変換前の hoge.sh (LF形式) の内容を確認する
$ cat -v -A hoge.sh
#!/bin/bash$
echo "Hello, world!"$
# nkfでCRLF形式に変換する
$ nkf -Lw hoge.sh > hoge2.sh
# 変換後の hoge2.sh (CRLF形式) の内容を確認する。行末に ^M が付加されている。
$ cat -v -A hoge2.sh
#!/bin/bash^M$
echo "Hello, world!"^M$
# CRLF形式のシェルスクリプトを実行しようとするとエラーになる。Ubuntu 24.04 LTSのbashでは以下のエラーが表示される。
$ bash hoge2.sh
/bin/bash^M: bad interpreter: No such file or directory
Windows 形式の改行コード (CRLF) から unix 形式の改行コード (LF) への変換
nkf -Lu hoge2.sh > hoge3.sh
ここで使用している -Lu
オプションは、nkfに対して入力ファイルを読み込み、改行コードをUnix形式 (LF) に変換して出力することを指定している。
* Ubuntu での実行例

(上記は実行例のスクリーンショットであるが、以下に具体的なコマンドと出力をテキストで示す。)
# 変換前の hoge2.sh (CRLF形式) の内容を確認する
$ cat -v -A hoge2.sh
#!/bin/bash^M$
echo "Hello, world!"^M$
# nkfでLF形式に変換する
$ nkf -Lu hoge2.sh > hoge3.sh
# 変換後の hoge3.sh (LF形式) の内容を確認する。行末の ^M が取り除かれている。
$ cat -v -A hoge3.sh
#!/bin/bash$
echo "Hello, world!"$
# LF形式に変換したシェルスクリプトは正しく実行できる
$ bash hoge3.sh
Hello, world!
Ubuntu に nkf のインストール
# パッケージリストの情報を更新
sudo apt update
sudo apt -y install nkf
Ubuntu 環境に nkf をインストールするには、apt
パッケージマネージャーを用いるのが一般的である。上記のコマンドでインストールが可能である。Ubuntu 24.04 LTS でも同様の手順で nkf パッケージをインストールできることを確認している。