ls コマンドの --color オプションの挙動が自分の認識と違っていたので、メモ。

ls コマンドに --color オプションを指定すると、出力時に、ファイルタイプ(ディレクトリとかシンボリックリンクとか)によって色づけ(ハイライト)してくれます。

普段の作業にはとても便利な機能なので、シェルの alias 設定で指定している人も多いのではないでしょうか。

ただ、この --color オプションを使うにあたって、ひとつだけ注意しなければなりません。 ls コマンドの出力をパイプにつないでワンライナーを書く時に、ハイライト機能が有効になっていると正しく動きません。

1
/bin/ls --color | xargs -d '\n' -n 1 hogehoge.pl

この対策として、--color=auto と指定しておくと、出力先が端末(ターミナル)でない場合にハイライト機能を無効化してくれます。とても便利。

で、Seaoak の認識では、単に --color と指定した場合は --color=auto になると思っていました。しかしながら、Ubuntu 16.04.1 LTS や Git for Windows (2.10.2) では、 --color--color=always と解釈されるのでした。ちゃんと man にも明記されています。

1
2
3
--color[=WHEN]
colorize the output; WHEN can be 'always' (default if omitted),
'auto', or 'never'; more info below

おそらくですが、ls | less -R としたときにハイライト機能を有効にしたい、というのが理由と推測されます。

以上の結論として、「ワンライナーを書く時は \ls または /bin/ls と書きましょう」ということになります。

おまけ

ちなみに、似たような便利機能で -F オプションがあります。ファイルタイプによって末尾に / とか @ とか * とか付けてくれる機能です。こちらは出力先が端末か否かに関係なく常に有効になります。よって、ワンライナーを書く時は、やっぱり \ls または /bin/ls と書くのが確実です。

おまけ2

grep コマンドにも --color オプションがあります。こちらは単に --color と指定すると --color=auto と解釈されるようです。 man やヘルプには明記されていませんが、 Ubuntu 16.04.1 LTS や Git for Windows (2.10.2) で試すとそうなります。統一感が無いですね・・・・。

おまけ3

git コマンドの grep--color と指定した場合は --color=always と解釈されます。man git-grep 参照。