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 "$@" ;}
我对 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 "$@" ;}