概要
Windows PCで作成したシェルスクリプトをUSBメモリ経由でLinux環境(ラズパイ)に移動して実行する際、正常に動作しないことがありました。本記事では、この問題の原因と解決方法について説明します。
問題の原因
Windows環境とUnix/Linux環境では、テキストファイルの改行コードが異なります。
-
Windows:
CRLF
(Carriage Return + Line Feed,\r\n
) -
Unix/Linux:
LF
(Line Feed,\n
)
この改行コードの違いにより、Linux環境でスクリプトを実行した際にコマンドが正しく解釈されず、期待した動作を行わない場合があります。
解決方法1:trコマンドによる変換
tr -d '\r' < ./hoge.sh > ./huga.sh
この方法では、キャリッジリターン(\r
)を削除して新しいファイルを作成します。元のファイルは変更されません。
解決方法2:sedコマンドによる変換
sed -i 's/\r$//' ./hoge.sh
sed
コマンドの-i
オプションを使用することで、ファイルを直接編集できます。行末のキャリッジリターンを削除します。
解決方法3:dos2unixコマンドによる一括変換
複数のスクリプトファイルを一括で変換する場合は、dos2unix
コマンドを使用します。
# Raspberry Pi OS(Debian系)なら
sudo apt install dos2unix
# Ubuntu環境なら
sudo apt-get install dos2unix
find ./dir -name "*.sh" -type f -exec dos2unix {} \;
このコマンドは、指定したディレクトリ以下のすべての.sh
ファイルを検索し、改行コードをUnix形式に変換します。
まとめ
Windows環境で作成したスクリプトファイルをLinux環境で実行する際は、改行コードの違いに注意する必要があります。特に複数のファイルを扱う場合は、dos2unix
コマンドを使用した一括変換が効率的です。