Как показано на рисунке, я использую, l
чтобы получить файл в текущей папке. И тогда я хочу получить файл с номером 1
, поэтому я использую pipe
и grep
.
Но почему 2
и 22
файл показывают? А что это 1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
Обновить
У меня уже есть псевдоним команды l
в моем zshrc
файле.
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
И вот результат type
команды:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
command-line
grep
ls
pipe
подветренный
источник
источник
type -a l
?type ls
команды, пожалуйста? Вы изменилиls
псевдоним в любом случае?Ответы:
Во-первых, то, что вы пытаетесь сделать,
l| grep <filename>
плохо. Не делай этого. Вот почемуl
Команда действительно псевдонимls -CF
По умолчанию в Ubuntu
bash
,ls
это псевдонимls --color=auto
. Как указал стилдрайвер в комментариях--color=auto
, предполагается отключить окраску. В вашем конкретном случае у вас естьalias ls="ls -alh --color"
иalias l="ls -CF"
, который в основном заканчиваетсяls -alh --color -CF
. Эта конкретная комбинация переключателей по-прежнему отправляет цветной вывод по каналу. Например:Обратите внимание , как
.
и..
каталоги имеют одни и те же управляющие последовательности.Что все это значит
Это означает, что
l
будет выведен цветной список файлов в соответствии с типом файла. Проблема в том, что раскрашивание происходит с использованием escape-последовательностей . Это то,1:34m
что есть - это escape-последовательность для определенных цветов.Основная проблема заключается в том, что синтаксический анализ
ls
часто приводит к неправильным выводам и сбоям в сценариях просто потому, чтоls
допускает escape-последовательности, подобные описанным ранее, и другие специальные символы. См. Эту статью для получения дополнительной информации: http://mywiki.wooledge.org/ParsingLsЧто вы должны делать:
Используйте
find
команду:Вы можете сделать что-то подобное с помощью shell glob и современной тестовой
[[
команды:Или, может быть, использовать Python, который имеет гораздо лучшие возможности обработки имен файлов, чем
bash
одинЕсли нет необходимости обрабатывать выходные данные
ls
, тоls
можно выполнить и простое переключение с помощью. (Помните, это только для просмотра списка файлов, а не для передачи его другой программе для обработки выходного текста)источник
--color=always
он также указан - либо как часть псевдонима для себя,l
либо как предыдущий псевдоним дляls
себя (заменив значение по умолчаниюalias ls='ls --color=auto'
).ls
в bash по умолчанию?type ls
дает мне, что это псевдоним дляls --color=auto
auto
отключает цвет в трубе AFAIK. Чтобы увидеть цветовые последовательности ANSI, его необходимо изменить--color=always
наls
псевдоним илиl
псевдонимls --color
, не препятствует раскрашиванию (я тоже это проверял). Обновил мой ответ соответственноВаши
l
иls
команды настроены как псевдонимы.Когда вы запускаете их, выводите данные через
grep "1"
(используя|
) каждую строку экрана, где1
появляется, с1
красным цветом.Так как имена файлов
.
,..
,2
и22
появляются на том же экране линии, они выводятсяgrep
как хорошо , но не отображаются красным цветом , который показываетgrep
матчи.Это
:34m
escape-последовательность для цвета, который не рисует должным образом. На основании вашего пересмотренного вопроса с выводомtype -a l
иtype -a
его можно воспроизвести в моей системе. Пожалуйста , обратите внимание , вы должны изменить свой псевдоним от--color
до--color=auto
:Цветной выход
источник
1:34m
не искажение, это escape-последовательности, используемые для раскрашивания текста. Смотрите мой ответ на эту часть;)В вашем испытании вы называли свой
ls
псевдоним, таким образом,1;34m
и тому подобный шум, который исходит от окраски, и так как канал|
получает все это на той же строке,grep
сопоставляет файл1
из этой строки и, следовательно, печатает эту строку. Это то, что вы видите на экране.Когда вы делаете подобные вещи, всегда хорошо вернуться к системной команде с 1 результатом на строку.
Чтобы избавиться от псевдонимов, просто введите
\ls
и используйте опцию-1
для печати результатов, разделенных переводом строки.Примечание: метод обратной косой черты работает с каждой командой,
\command
просто вызывает системную команду без слияния.источник