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

问题描述 投票:0回答:1

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

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

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

results of ls command with grc

但当我使用循环命令时,问题就会发生,例如当我使用 ls :

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

的确,我得到的结果是:

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

结果是 ls 命令中 for i in $(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

但我很无聊地指定了选项 --color=never 对于 ls 每次在我的Shell脚本中。

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

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

这样一来,我就不用再使用 --color=never 但现在,我失去了一个简单的着色结果。|~| ls commmand。

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

我不知道是否有可能在这两种规格之间切换。例如,也许我可以自动检测是否 ls 命令包含在一个 for loop 我不确定,但我愿意听取任何建议来解决这个问题。

macos terminal zsh ls
1个回答
1
投票

你有没有试过?

function ls { local color; [ -t 1 ] && color="--color"; grc -es --colour=auto ls $color -Gh -C -rt "$@" ;}
© www.soinside.com 2019 - 2024. All rights reserved.