web-dev-qa-db-ja.com

lsコマンドのカラー出力が少ない

lsを実行すると、色付きの出力が得られます。これは、ファイルの種類をすばやく確認するのに非常に便利です。 -rフラグと-Rフラグを使用しても、lessにパイプで接続しようとすると、色が常に失われます。 zshバージョン5.0.7を使用しています。何か案は?ありがとう。

編集:私はOS Xを使用しています。

21
nunos

これは仕様によるものです。通常、カラー出力を生成するプログラムは、出力がターミナルまたは通常のファイルに送信されたときではなく、ターミナルに送信されたときにのみそれを行います。その理由は、端末に送信されたデータはおそらく人間によって読み取られますが、プログラムにパイプされたデータやファイルに書き込まれたデータは、一部のプログラムによって解析される可能性が高いため、色を変えるエスケープシーケンスなどの無関係なコンテンツを含めることはできません。

GNU lsは、オプション--color(または--color=auto)を渡すと、端末に色付きの出力を表示します。標準出力のファイルタイプに関係なくカラー出力を強制するには、--color=alwaysまたは--color=yesを渡します(これらは同義語です)。この慣習には、GNU grep、FreeBSD grep、git diffなどのような他のコマンドが続きました。

ls --colors=yes -l | less

FreeBSDバージョンのls(OSXにもあり、OpenBSDおよびNetBSDのcolorlsポートとして利用可能)では、オプション-Gを渡して、出力がターミナル。出力ファイルのタイプに関係なく色を表示するように環境CLICOLOR_FORCEを設定します。

CLICOLOR_FORCE=1 ls -l | less

問題はおそらくlsプログラムがオプション--color=autoを設定していることです。これは基本的に、出力がターミナルに接続されている場合にのみ色付けする必要があることを意味します。色が出ます。

色が欲しい場合は、--colorオプションをalwaysに設定する必要があります。

ls --color=always | less -R

この振る舞いがいつも期待するものである場合は、単にエイリアスを作成します。

alias ls='ls --color=always'
20
jimmij

担当者が50人に満たないため、@ jimmijの回答にコメントすることはできませんが、Bashで何がうまくいったかを説明したいと思います。

走れば

$ man ls | grep color

特定のシェル環境(この場合はman)のbash- pageのすべてのエントリが表示されます。

私にとっては、次の調整でうまくいきました:

$ alias ls='ls -G'
0