こんな経験をしたことはありませんか?実はこれ、WSL2を使い始めた初心者が最初につまずくポイントのひとつです。原因は「改行コード」の違いにあります。
実行環境:Ubuntu 24.04 LTS(WSL2)・Rocky Linux 9.4 で動作確認済み
この記事では、WindowsとLinuxの改行コードの違いをわかりやすく説明し、cat -A や file コマンドで問題を特定し、dos2unix コマンドで一括修正する手順を、実際の実行例付きで解説します。
この記事のポイント
・WSL2でのスクリプトエラーの原因は改行コード(CRLF)が混入しているから
・cat -A コマンドで「^M」が表示されればCRLFが混入している証拠
・dos2unix コマンド1つでLFに一括変換できる(apt/dnfでインストール)
・VS Codeのデフォルト改行コードをLFに設定すれば再発を防げる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
WindowsとLinuxの改行コードの違いとは?
テキストファイルには「行の終わりはここです」という記号が含まれています。これを「改行コード」と言います。問題は、WindowsとLinuxでは、この改行コードの種類が異なることです。
| OS | 改行コード | 記号 | 内容 |
|---|---|---|---|
| Windows | CRLF | CR(キャリッジリターン)+ LF(ラインフィード)の2文字 | |
| Linux / Mac | LF | LF(ラインフィード)の1文字のみ |
たとえば、シェルスクリプトの1行目
#!/bin/bash がWindowsで書かれた場合、Linuxからは #!/bin/bash
と見えます。/bin/bash
という実行ファイルは存在しないため、「bad interpreter」エラーになります。改行コードを確認する方法
まず、ファイルにCRLFが混入しているかどうかを確認しましょう。1. cat -A コマンドで確認する
cat -A コマンドは、通常は見えない特殊文字を画面に表示します。CR(
)は ^M として表示されます。# check if the file has crlf line endings (^M means crlf) cat -A test.sh
user@DESKTOP-LM2024:~$ cat -A test.sh #!/bin/bash^M$ echo "Hello, World!"^M$ sleep 1^M$ echo "Done."^M$
^M$ と表示されている行は、CRLF(
)で終わっています。$ だけの行はLFのみで正常です。2. file コマンドで確認する
file コマンドを使うと、ファイルの改行コードの種類を一言で確認できます。# ファイルの種類と改行コードを確認する file test.sh
user@DESKTOP-LM2024:~$ file test.sh test.sh: POSIX shell script, ASCII text executable, with CRLF line terminators
改行コードをLFに変換する方法
1. dos2unix をインストールする
CRLFをLFに変換するには、dos2unix コマンドが便利です。WSL2(Ubuntu)にはデフォルトで入っていないことがあるため、まずインストールします。# Ubuntu / Debian 系(WSL2デフォルト) sudo apt install -y dos2unix # Rocky Linux / RHEL 系 sudo dnf install -y dos2unix
2. dos2unix で CRLF を LF に変換する
注意:dos2unix は元のファイルを直接上書きします。大切なファイルは事前にバックアップを取ってください。インストールができたら、以下のコマンドでファイルを変換します。
# CRLFをLFに変換する(元ファイルを上書き) dos2unix test.sh
user@DESKTOP-LM2024:~$ dos2unix test.sh dos2unix: converting file test.sh to Unix format...
cat -A で確認すると、^M が消えているはずです。user@DESKTOP-LM2024:~$ cat -A test.sh #!/bin/bash$ echo "Hello, World!"$ sleep 1$ echo "Done."$
^M が消えて $ だけになりました。これでスクリプトが正常に動作します。3. dos2unix がない場合は tr コマンドで代替する
dos2unix がインストールできない環境では、tr コマンドで代替できます。ただし、元ファイルの直接上書きはできないため、別ファイルに出力してから置き換えます。# (CR)を削除して新しいファイルに出力する tr -d ' ' < test.sh > test_fixed.sh # 内容を確認してから元ファイルを置き換える mv test_fixed.sh test.sh
再発させないための設定
ファイルを修正しても、毎回Windowsで編集するたびにCRLFが混入してしまいます。根本的に防ぐための設定を紹介します。1. VS Code のデフォルト改行コードを LF に変更する
WSL2で作業する方の多くがVS Codeを使っているはずです。VS Codeのデフォルト改行コードをLFにすることで、新しく作成するファイルにCRLFが混入しなくなります。・VS Codeを開き、ウィンドウ右下の「CRLF」または「LF」の表示をクリックする
・ドロップダウンで「LF」を選択する
または、設定ファイル(
settings.json)に以下を追加する方法もあります。# VS Code の settings.json に追加(デフォルト改行コードをLFに設定) { "files.eol": " " }
2. .gitattributes で自動管理する(Git 使用者向け)
Gitでバージョン管理している場合は、.gitattributes ファイルを作成してシェルスクリプトの改行コードをLFに固定できます。# shell scripts and config files: always use lf (not crlf) *.sh text eol=lf *.conf text eol=lf *.yaml text eol=lf *.yml text eol=lf
トラブルシュート
「bad interpreter: No such file or directory」が出たときの確認手順
このエラーが出たら、まず改行コードを疑ってください。以下の順序で確認します。・
file スクリプト名 を実行して「CRLF」と表示されるか確認する・「with CRLF line terminators」があれば
dos2unix スクリプト名 で変換する・変換後に
chmod +x スクリプト名 で実行権限を付与する・再度
./スクリプト名 で実行する改行コードを修正してもエラーが出る場合は、実行権限が付いていない可能性があります。
# 実行権限を確認する(末尾に x が付いていることを確認) ls -la test.sh # 実行権限を付与する chmod +x test.sh
本記事のまとめ
WSL2での改行コード問題への対処法をまとめます。| やりたいこと | コマンド |
|---|---|
| 改行コードを目視で確認する | cat -A ファイル名 |
| 改行コードの種類を確認する | file ファイル名 |
| CRLFからLFへ変換する | dos2unix ファイル名 |
| LFからCRLFへ変換する(逆変換) | unix2dos ファイル名 |
| dos2unix なしでCRLFを除去する | tr -d '
' < 入力 > 出力 |
| dos2unix をインストールする(Ubuntu) | sudo apt install dos2unix |
| dos2unix をインストールする(RHEL系) | sudo dnf install dos2unix |
dos2unix を使いこなして、スクリプトのトラブルをすばやく解決できるようにしておきましょう。Linuxのシェルスクリプトやサーバー管理をさらに深く学びたい方は、ぜひ以下の関連記事も参照してください。
無料の「Linuxサーバー構築入門マニュアル(図解60ページ)」をプレゼントしています。
WSL2とLinuxの連携をさらに深め、実務で使えるスキルを身につけたい方は、ぜひ受け取ってみてください。
無料マニュアルを受け取る >>
関連記事(Linux実務スキル)
改行コードの問題を解決したら、次はLinux実務スキルの各テーマを深掘りしていきましょう。・trapコマンドでbashスクリプトのシグナルを捕捉・処理する方法|一時ファイル削除やエラー終了処理の実践例も【シェルスクリプト】
・fail2banコマンドでブルートフォース攻撃を自動ブロックする方法|SSHの不正アクセス対策とトラブルシュートも【セキュリティ】
・nmcliコマンドでネットワーク接続を設定する方法|静的IP・DHCP・接続追加・削除の手順も【サーバー構築】
・straceコマンドでプロセスのシステムコールを追跡する方法|Permission deniedの原因特定やデバッグも【トラブルシューティング】
・nmapコマンドでポートスキャン・ネットワーク診断を行う方法|-sSや-Aの使い方とセキュリティ活用も【ネットワーク】
・lsblkコマンドでブロックデバイスを一覧表示する方法|ディスク構成やパーティション確認も【ディスク操作】
・watchコマンドで定期的にコマンドを繰り返し実行する方法|変化の検出やログ監視にも【Linux Tips】
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:LinuxでOllamaを使ってAIと会話する入門|WSL2やVPSに無料でLLMをインストールする方法
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます