it-swarm-ja.com

macOSで出力カラーを保持しながら、「ls-G1」の出力を「sed」にパイプします

MacOSでターミナルを使用する場合、~/.bash_profileにエイリアスを作成しました。これにより、次のような-G1オプションを使用して、フォルダとファイルを1つの列に色で一覧表示できます。

something = "ls -G1"

これはうまく機能しますが、次のような出力になるようにスペース(インデント)を追加したいと思います。

Folder 1
Folfer 2
Folder 3

になります:

<space>Folder 1
<space>Folder 2
<space>Folder 3

これは、sed 's/^/ /'を追加して次のように書くと可能になります。

something = "ls -G1 | sed 's/^/   /'"

しかし、sedを追加すると、何をしても出力色が失われます。

ls出力にインデントを追加し、元の出力色を保持する方法はありますか?

2
Giuseppe

nix&Linux Stack Exchange に関するこの回答で説明されているように、次のように、そのコマンドの前にCLICOLOR_FORCE=1を付ける必要があります。

CLICOLOR_FORCE=1 ls -G1 | sed 's/^/   /'

したがって、エイリアスは次のようになります。

something = "CLICOLOR_FORCE=1 ls -G1 | sed 's/^/   /'"

lsコマンドの問題は-GCLICOLORと同等であるということです。これは このls環境変数のドキュメントページは次のとおりです =;大胆な強調は私のものです:

ANSIカラーシーケンスを使用してファイルタイプを区別します。以下のLSCOLORSを参照してください。

-Fオプションに記載されているファイルの種類に加えて、いくつかの追加の属性(setuidビットセットなど)も表示されます。色付けは、適切なtermcap(5)機能を備えた端末タイプに依存します。

デフォルトの「cons25」コンソールには適切な機能がありますが、たとえばxterm(1)で色を表示するには、TERM変数を「xterm-color」に設定する必要があります。他の端末タイプでも同様の調整が必要になる場合があります。

CLICOLOR_FORCE変数が定義されていない限り、出力が端末に送信されない場合、カラー化はサイレントに無効になります。

コマンドがls出力をsedにパイプしていることに注意してください。これは端末への直接出力ではないため、そのオプションはサイレントに無効になります。

したがって、次のように同じ ls環境変数ページ で説明されているCLICOLOR_FORCEを使用する必要があります。

出力が端末に向けられていない場合、カラーシーケンスは通常無効になります。これは、このフラグを設定することでオーバーライドできます。 TERM変数は、カラー対応端末を参照する必要がありますが、そうでない場合、使用するカラーシーケンスを決定することはできません。

1
JakeGould