Zsh - MacOS Catalina - автоматически удаляет ANSI-коды в l oop с помощью команды ls, сохраняя цвета для одной команды - PullRequest
0 голосов
/ 28 апреля 2020

У меня сложная конфигурация с командой 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

Но проблема возникает, когда я использую, например, команду al oop с 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) l oop генерируют коды 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 каждый раз в моей командной консоли scripts.

Поэтому я нашел другую альтернативу для удаления этих 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.

Итак, чтобы подвести итог, я хотел бы сохранить, когда я набираю простую команду ls, раскрашивание моего первого функц ion (function ls { grc -es --colour=auto ls --color -Gh -C -rt "$@" ;}), при этом используя ls в for i in $(ls ...); do ...; done l oop сценариев Shell, не указывая при этом каждый раз параметр --color=never.

Я не знаю, возможно ли переключиться между 2 спецификациями. Например, может быть, я мог бы автоматически определить, включена ли команда ls в for loop сценария оболочки, я не уверен, но я открыт для любых предложений по решению этой проблемы.

Спасибо за вашу помощь

1 Ответ

1 голос
/ 28 апреля 2020

Вы пробовали?

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