ken*_*n_o 8 command-line ls shell colors pipe
以交互方式使用 bash 我试图使用 cut 来防止线条长于我的终端宽度。但是当使用带有彩色输出的命令时,所有颜色都会被剪切去除。例如: ls -lG | cut -c 1-$COLUMNS
。
无论如何要剪切以保留颜色格式?
你这里有两个问题
ls -G
当输出没有到达终端(这里改为管道)时,停止以彩色输出。GNUls
需要传递一个--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/"
Run Code Online (Sandbox Code Playgroud)
在那里,sed
进行计数并添加一个\e[m
以将颜色恢复为默认值,以防它在此过程中被切割。
或者,您可以告诉您的终端不要包装并使用以下方法自行切割:
tput rmam
Run Code Online (Sandbox Code Playgroud)
(tput smam
恢复)
您可以定义一个函数,如:
nowrap() {
[ -t 1 ] && tput rmam
"$@"; local ret="$?"
[ -t 1 ] && tput smam
return "$ret"
}
alias nowrap='nowrap '
Run Code Online (Sandbox Code Playgroud)
(在alias
之后强制别名扩展的部分nowrap
),称为:
nowrap ls -l ...
Run Code Online (Sandbox Code Playgroud)