
改行コードについて_CRLF / LF / CR #186日目
Linux環境で作成されたファイルを、git cloneでWindows環境にクローンした時に発生したエラーからの学びです。
Linux系とWindows系の環境の大きな違いの一つに「改行コードの違い」があります。この違いによってプログラムが上手く動作しなくなったりするので、違いを認識したうえで対処する必要があります。
結論から書くと、以下のような整理になります。
Windowsは「CRLF (カーソルを左端に移動して改行[←+↓])」
Linux系は「LF (改行[ ↓ ])」
※MacOS9以前のLinux系は「CR (カーソルを左端に移動)」だった
直面したエラーについて
私が直面したエラーの流れは以下でした。
Linux系で作成されたファイルをWindowsにクローンして、改行コードが「CRLF」で保存される
CRLFで保存されたファイルを、Dockerコンテナ(Linux系OS)を立ち上げて使おうとしてエラーが発生
ファイルの中を見ると、全ての行末に「^M」という文字列が入っていた(これがCRLF(Windows)とLF(Linux)の違いによって起こるエラー)
解決策は2通り考えられました。
①ファイル内の「^M」をLinux環境に合わせて置換する
②Windows内にLinux環境を作ってそこで作業する
私の場合、他の人が作成した、(自分ではまだ理解できない)高度なファイルを触っていたのと、今後も気をつけ続けるのは大変だと思ったので、②でやってみました。
これには、以前の記事でご紹介しましたが、WSL2でLinuxディストリビューションのUbuntuを使えるようにしていたことが役立ちました。
実際にUbuntuでLinuxのファイルにクローンしてやってみたら、エラーは起きずに正常に動作しました。
では、そもそもこれらの改行コードはどういう背景で定まってきたのでしょうか?
改行コードの意味と歴史は?
冒頭に結論で【Windowsは「CRLF (カーソルを左端に移動して改行】と記載しましたが、これの意味が一発で分かる動画がブログで紹介されていました。Windowsの改行はテレタイプの名残だそうです(一説ですが)。
ちなみにUNIX系のOSで通信端末を表すttyという文字列も、このteletypeから来ているそうです。
動画を見ていただければ分かりますが、文字をタイプしているパーツが左に戻る時、同時に紙が上がって改行されています。Windowsはこの動きを名残として、CRLFを改行コードとして使い続けている形です。
反対に、Linux系はMulticsというOSの流れを汲んでいて、このMulticsはいち早くデバイスドライバという概念を導入していました。デバイスドライバはハードウェアを制御するためのソフトウェアで、他のソフトウェアとハードウェアの橋渡しをするためのものです。つまりテレタイプでの改行のような、ハードウェアに依存する部分の制御はデバイスドライバに任せ、ソフトウェアでは単純に「LF (改行)」のみを改行コードとして扱っていたのがMulticsでした。Linux系はこの流れを汲んでいるためLFが改行コードになっています。ちなみにCR はテレタイプ上で上書きすることによる太字や取り消し線の描画等に使う文字として残されたそうです。
上記は一説ではありますが、各改行コードの意味を記憶しやすくするという意味では有意義ではないかと思います。
さて、最後にちゃんとした整理を残して置きたいのですが、ブログに分かりやすい表が既に掲載されていたので以下で紹介させていただきます。



ここまでお読みいただきありがとうございました!!