Как показано на рисунке, я использую 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
В первую очередь, что Вы пытаетесь сделать, l| grep <filename>
плохо. Не делайте этого. Вот то, почему.
l
команда является действительно псевдонимом к ls -CF
$ type -a l
l is aliased to `ls -CF'
По умолчанию в Ubuntu bash
, ls
псевдоним к ls --color=auto
. Как steeldriver указанный в комментариях --color=auto
как предполагается, выключает колоризацию. В Вашем конкретном случае Вы имеете alias ls="ls -alh --color"
и alias l="ls -CF"
, который в основном заканчивает тем, что был ls -alh --color -CF
. Эта конкретная комбинация переключателей все еще отправляет цветной вывод по каналу. Например:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Заметьте как .
и ..
каталоги имеют те же escape-последовательности.
Это означает это l
произведет цветной список файлов согласно типу файла. Проблема состоит в том, что колоризация происходит с использованием escape-последовательностей. Это что 1:34m
вещи - они - escape-последовательность для определенных цветов.
Основной проблемой является тот парсинг ls
часто приводит к неправильному выводу и авариям в сценариях, просто потому что ls
позволяет escape-последовательности, любят объясненный ранее и другие специальные символы. См. эту статью для большего количества информации: http://mywiki.wooledge.org/ParsingLs
Использовать find
команда:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Вы могли сделать что-то вроде этого с шариком оболочки и современным тестом [[
команда:
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Или, возможно, используйте Python, который имеет намного лучшие возможности обработки имени файла, чем bash
один
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Если нет никакой потребности обработать вывод ls
, простой globbing с ls
может сделать работу, также. (Помните, это только для просмотра списка файлов, не для передачи его к другой программе для контакта с синтезируемым текстом),
bash-4.3$ ls *1*
1.txt
l
и ls
команды являются установкой как псевдонимами.Когда Вы выполняете их передающий вывод по каналу через grep "1"
(использование |
) каждая строка экрана, где 1
появляется отображен, с 1
окрашенный красный.
Поскольку имена файлов .
, ..
, 2
и 22
появитесь на той же строке экрана, они производятся grep
также, но не появляйтесь в красном, который показывает grep
соответствия.
:34m
escape-последовательность для цвета, который не красит правильно. На основе Вашего пересмотренного вопроса с выводом type -a l
и type -a
это может быть воспроизведено в моей системе. Обратите внимание, что необходимо изменить псевдоним от --color
кому: --color=auto
:
sudo
только имеет эффект на эти echo
команда, не перенаправление вывода. Попробуйте echo 'deb http://security.ubuntu.com/ubuntu bionic-security main' | sudo tee -a /etc/apt/sources.list
вместо этого.
– Stefan Hamcke
17 October 2018 в 22:03
В Вашей пробной версии Вы называли Ваш ls
псевдоним, таким образом 1;34m
и подобный шум, которые прибывают из окраски, и так как канал |
получает все это на той же строке, grep
соответствия файл 1
от той строки и следовательно печатает эту строку. Это - то, что Вы видите на экране.
при выполнении материала как этот всегда хорошо вернуться к системной команде с 1 результатом на строку.
, Чтобы избавиться от псевдонимов просто тип \ls
и использовать опцию -1
распечатать результаты, разделенные с методической точностью, питается.
$ \ls -1 | grep "1"
1
11
Примечание: метод обратной косой черты работает с каждой командой, \command
просто вызовы неискаженная системная команда.