У меня сложная конфигурация с командой ls
. В самом деле, я использую grc
, чтобы раскрасить результаты различных команд терминала, используя iTerm2
в MacOS Catalina. Моя проблема о ls
, у меня на данный момент в .zshrc
:
function ls { grc -es --colour=auto ls --color -Gh -C -rt "$@" ;}
, и когда я набираю |~/Test_data| ls
, я получаю, например:
Но проблема возникает, когда я использую, например, команду 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
сценария оболочки, я не уверен, но я открыт для любых предложений по решению этой проблемы.
Спасибо за вашу помощь