はじめに
先日Windows上で作成されたリストファイルを元に動作するシェルスクリプトを作成したのですが、Linuxでそのスクリプトが動作しないという事態が発生しました。
原因は分かってしまえば簡単なことでしたが、恥ずかしいことに原因究明まで1週間以上も苦しめらてしまいました。
2度と同じ轍を踏まないためにも備忘録を残したいと思います。
今後も普通にあり得る話だし。
原因一
ご察しの通り改行コードが原因でした。流石にこれは自分でも気付きました。普段シェルスクリプトを作成するときは、Linux上で作成するし都合上busybox(Winで動くShellみたいなもの)を利用しなければいけないという特殊な状況だったのでこれに関しては実行前にvimで対応をとっていました。
vimで開いて以下のコマンド実行
:s/\r//g
もしくは
:s/^M//g どちらも同じ意味。
補足すると
- LF
- UNIXの改行コード
- CRLF
- Windowsの改行コード
しかし、これだけでは不十分だったので時間が掛かってしまった。
原因二
ff
それはファイルフォーマットです。改行コードに隠れてとんでもない伏兵が隠れていたもんです。
このセクションは説明が長くなるので先に修正方法を述べておきます。
vimで開いて以下のコマンド実行
:se ff=unix
これで問題は解決されます。
補足
改めてそもそもの話を説明すると、シェルスクリプトを実行する際、原因一の通りCRLFからLFになるように改行コードの置換を行いました。
その後スクリプトの実行自体は上手く行えたのですが、想定の動作をせずエラーを吐いてしまいます。
そこで全てログに出力し確認してみると、いるではないか「^M」が……
さらに精査していくとリストファイルから読みだして変数に代入する際にもれなく「^M」が混入していることが確認されました。
確実に実行前に件のリストファイルも含めて全ての改行コードを置換したはずなのに、どうしてゾンビの如くこの制御文字は復活してくるのか謎で仕方ありませんでした。
そこでvimの設定を変え、ファイルの状況を確認するところから行ってみました。
以下の手順。
vimの設定ファイルを作成
$ vi .vimrc
fileformats=unix,dos,mac
これは改行コードを自動判別させる設定です。
設定を反映しリストファイルを開きなおすと、案の定でした。
やはり「dos」と出ていた。
つまり改行コードさえ置換しておけば問題ないつもりだったのですが、ファイルフォーマットも変更しなければ、制御文字を補完してしまう可能性があるということです。
とにもかくにも問題が解決できてすっきりしました……