Cygwin の cat コマンドでハマった事

今年の春に、ある社内ツールをシェルスクリプトと awk で書きました。その時、Cygwin の cat コマンドでちょっとハマった事を思い出したので書いておきます。

改行コード

Debian にて 3 つの改行を含むテキストファイル a.txt を作成。この時、a.txt の改行コードは LF。

dyama@debian:~$ cat > a.txt


^D

nkf で改行コードを CRLF にして b.txt を作成。

dyama@debian:~$ nkf -Lw a.txt > b.txt

もちろん、cat で吐いた文字数は異なります。

dyama@debian:~$ cat a.txt | wc -c
3
dyama@debian:~$ cat b.txt | wc -c
6

この a.txt と b.txt を Windows の Cygwin 環境に持ってきます。(もちろん、自動的に改行コード変換をする FTP ソフトなどは経由せずに)

同じく cat で吐いた文字数を調べようとすると

$ cat a.txt | wc -c
3
$ cat b.txt | wc -c
3

えっ

おそるおそるファイルサイズを調べます。

$ ls -l a.txt b.txt
-rw-r--r-- 1 dyama hogehoge 3 Sep 24 17:44 a.txt
-rw-r--r-- 1 dyama hogehoge 6 Sep 24 17:44 b.txt

なにこれこわい。

Cygwin のセットアップ時に、改行コードを DOS の CR+LF にするか、UNIX の LF のみにするかを選択する事が出来ますが、どうも Cygwin に添付されている cat コマンドだけは、是が非でも CRLF を改行コードとして入出力するらしいです。

LF 改行なシェルスクリプトの中で cat コマンドを使って、ファイル出力などをやっていたので、見事につまづきました。

さらに、出力したファイルを awk で行パターンマッチさせようとして、全然動いてくれなくて数日悩みました。ほんと、明記しておいて欲しいなあ。

ちなみに、件についてしっかりと書いてあるのは、本日現在、このページくらいでした。ココがなければずっと迷っていたと思います。多謝。

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください