Shell
通過剪切保留顏色輸出
以互動方式使用 bash 我正在嘗試使用 cut 來防止線條長度超過我的終端寬度。但是當使用帶有彩色輸出的命令時,所有顏色都會被剪切刪除。例如:
ls -lG | cut -c 1-$COLUMNS
。無論如何要剪切以保留顏色格式?
你這裡有兩個問題
ls -G
當輸出沒有到達終端(這裡改為管道)時,停止彩色輸出。GNUls
需要傳遞一個--color=always
選項,對於 BSDls
,您需要將環境設置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
進行計數並添加 a\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 ...