Bashをインタラクティブに使用して、線が端末の幅より長くならないようにカットを使用しようとしています。ただし、色付きの出力でコマンドを使用すると、すべての色がカットによって削除されます。例えば: ls -lG | cut -c 1-$COLUMNS
。
カラーフォーマットを維持するためにカットする方法はありますか?
ここには2つの問題があります
ls -G
は、出力が端末(ここでは代わりにパイプ)に送信されない場合、カラーでの出力を停止します。 GNU ls
には--color=always
オプションを渡す必要があり、BSD ls
の場合は、環境CLICOLOR_FORCE
をに設定する必要があります。常にカラーで出力するように指示する空でない値。色は、前景の赤の<ESC>[31m
のような文字のシーケンスであるエスケープシーケンスを出力することによって実現されます。表示時に幅はありませんが、cut
に関する限り、これは5文字で、$COLUMNS
までカウントされます。
したがって、計算でこれらのエスケープシーケンスを無視する必要があるため、ここではcut
を使用できません。代わりに、次のようなことができます。
esc=$'\e'
CLICOLOR_FORCE=1 ls -l | sed "s/\(\(\($esc\[[0-9;]*m\)\{0,1\}.\{0,1\}\)\{$COLUMNS\}\).*/\1${esc}[m/"
そこで、sed
がカウントを行い、\e[m
を追加して、プロセスでカットされた場合に備えて色をデフォルトに戻します。
または、端末にラップしないように指示して、次のコマンドで切断することもできます。
tput rmam
(tput smam
復元する)
次のような関数を定義できます。
nowrap() {
[ -t 1 ] && tput rmam
"$@"; local ret="$?"
[ -t 1 ] && tput smam
return "$ret"
}
alias nowrap='nowrap '
(alias
の後にエイリアス拡張を強制するnowrap
部分)、次のように呼び出されます。
nowrap ls -l ...
man ls
:
--color[=WHEN]
colorize the output; WHEN can be 'never', 'auto', or 'always' (the
default); more info below
ls
はおそらく--color=auto
用に構成されています。つまり、端末に直接接続されている場合にのみ色を出力します。 (そして、カットのような別のコマンドではありません。)
--color=always
を使用できますが、色のオンとオフを切り替える特殊文字(エスケープシーケンス)を挿入することで、色全体が機能することに注意してください。色付きの単語の途中で切り取ると、「色付けを停止」シーケンスが削除され、次の行も色付けされます。
たぶんls --color=always|less -RS
はあなたが望むことをするでしょう。
端末への出力を偽造して色の書式を保持するには、(FreeBSD)ls
コマンド(または ptymagic.cなどのツール)を使用して疑似端末でscript
を実行できます。 )。
script -q /dev/null ls -lG | tr -d '\r' | cut -c 1-$COLUMNS
ptymagic ls -lG | cut -c 1-$COLUMNS