Zsh - MacOS Catalina - 使用 ls 命令自动将 ansi 代码删除到循环中,同时保持单个命令的颜色

Zsh - MacOS Catalina - automatically remove ansi codes into loop using ls command while keeping colors for a single command

我对 ls 命令有一个棘手的配置。实际上,我正在使用 grc 将使用 iTerm2 的不同终端命令的结果着色到 MacOS Catalina 中。我的问题是关于 ls,我暂时进入 .zshrc :

function ls { grc -es --colour=auto ls --color -Gh -C -rt "$@" ;}

当我输入 |~/Test_data| ls 时,我得到例如:

但是当我使用带有 ls 的循环命令时会出现问题:

|~/Test_data| for i in $(ls); do echo $i | xargs ls -lrt; done

的确,我得到的结果是:

ls: cannot access ''$'3''[0m'$'3''[01;37m'$'3''[m'$'3''[00;37mdata_0.txt'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;37mdata_4.txt'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;36mdata_3.py'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;37mdata_2.dat'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;35mdata_1.png'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;37mdata_1.txt'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;36mdata_0.py'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;36mdata_4.py'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;37mdata_3.dat'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;35mdata_2.png'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;37mdata_2.txt'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;36mdata_1.py'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;37mdata_0.dat'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;37mdata_4.dat'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;35mdata_3.png'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;37mdata_3.txt'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[00;36mdata_2.py'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;37mdata_1.dat'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;35mdata_0.png'$'3''[0m': No such file or directory
ls: cannot access ''$'3''[01;37m'$'3''[m'$'3''[01;35mdata_4.png'$'3''[0m': No such file or directory

for i in $(ls) 循环中 ls 命令的结果生成管道无法处理的 ansi 代码 xargs ls -lrt

解决方法是在这种情况下编写:

|~/Test_data| for i in $(ls --color=never); do echo $i | xargs ls -lrt; done

我得到一个“正常”的文件列表:

~/Test_data| for i in $(ls --color=never); do echo $i | xargs ls -lrt; done
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_0.txt
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_4.txt
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_3.py
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_2.dat
-rw-r--r-- 1 fab staff 0 Apr 28 10:34 data_1.png
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_1.txt
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_0.py
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_4.py
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_3.dat
-rw-r--r-- 1 fab staff 0 Apr 28 10:34 data_2.png
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_2.txt
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_1.py
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_0.dat
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_4.dat
-rw-r--r-- 1 fab staff 0 Apr 28 10:34 data_3.png
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_3.txt
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_2.py
-rw-r--r-- 1 fab staff 0 Apr 28 10:32 data_1.dat
-rw-r--r-- 1 fab staff 0 Apr 28 10:34 data_0.png
-rw-r--r-- 1 fab staff 0 Apr 28 10:34 data_4.png

但我厌倦了在我的 Shell 脚本中每次都为 ls 指定选项 --color=never

所以我找到了另一种方法来删除这些 ansi 代码,方法是将 ~/.zshrc :

function ls { grc -es --colour=auto ls --color -Gh -C -rt "$@" | gsed -r 's/'$(echo -e "3")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' ;}

这样,我不必使用 --color=never ,但现在,我可以通过简单的 |~| ls 命令获得彩色结果。

所以,总而言之,当我输入简单的命令 ls 时,我想保留我的第一个函数 (function ls { grc -es --colour=auto ls --color -Gh -C -rt "$@" ;}) 的色彩,同时能够使用 ls 进入 for i in $(ls ...); do ...; done 循环 Shell 脚本而不每次都指定选项 --color=never.

我不知道是否可以在 2 个规格之间切换。例如,也许我可以自动检测 ls 命令是否包含在 shell 脚本的 for loop 中?

你试过了吗?

function ls { local color; [ -t 1 ] && color="--color"; grc -es --colour=auto ls $color -Gh -C -rt "$@" ;}