Jak pokazuje zdjęcie, używam, l
aby pobrać plik do bieżącego folderu. A potem chcę uzyskać plik z numerem 1
, więc używam pipe
i grep
.
Ale dlaczego wyświetlają się pliki 2
i 22
? A co jest 1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
Aktualizacja
Mam już alias polecenia l
w moim zshrc
pliku.
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
A oto wynik type
polecenia:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
command-line
grep
ls
pipe
Zawietrzny
źródło
źródło
type -a l
?type ls
polecenia? czyls
w jakikolwiek sposób zmodyfikowałeś alias?Odpowiedzi:
Po pierwsze, to, co próbujesz zrobić,
l| grep <filename>
jest złe. Nie rób tego Dlatego.l
polecenie jest naprawdę pseudonimemls -CF
Domyślnie w Ubuntu
bash
,ls
jest aliasemls --color=auto
. Jak zauważył Steeldriver w komentarzach,--color=auto
ma wyłączać kolorowanie. W twoim konkretnym przypadku maszalias ls="ls -alh --color"
ialias l="ls -CF"
, co w gruncie rzeczy kończy sięls -alh --color -CF
. Ta szczególna kombinacja przełączników nadal wysyła kolorowe wyjście przez potok. Na przykład:Zauważ, że katalogi
.
i..
mają takie same sekwencje specjalne.Co to wszystko znaczy
Oznacza to, że
l
wyświetli pokolorowaną listę plików według typu pliku. Problem polega na tym, że koloryzacja zachodzi przy użyciu sekwencji ucieczki . Właśnie takie1:34m
są rzeczy - są sekwencjami ucieczki dla określonych kolorów.Główny problem polega na tym, że parsowanie
ls
często prowadzi do złych wyników i katastrof w skryptach, po prostu dlatego, żels
umożliwia sekwencje specjalne, jak wyjaśniono wcześniej, i inne znaki specjalne. Zobacz ten artykuł, aby uzyskać więcej informacji: http://mywiki.wooledge.org/ParsingLsCo powinieneś robić:
Użyj
find
polecenia:Możesz zrobić coś takiego z globem powłoki i nowoczesnym
[[
poleceniem testowym :A może użyj Pythona, który ma znacznie lepsze możliwości obsługi nazw plików niż
bash
samJeśli nie ma potrzeby przetwarzania wyniku
ls
, proste globowanie za pomocąls
może również wykonać pracę. (Pamiętaj, że służy to tylko do przeglądania listy plików, a nie do przekazywania jej do innego programu w celu obsługi tekstu wyjściowego)źródło
--color=always
jest to określone - albo jako część aliasu dla siebie,l
albo w poprzednim aliasiels
(zastępując domyślnyalias ls='ls --color=auto'
).ls
domyślnie domyślna wersja bash?type ls
daje mi dols --color=auto
auto
wyłącza kolor w rurce AFAIK. Aby zobaczyć sekwencje kolorów ANSI, trzeba było zmienić to--color=always
nals
alias lubl
aliasls --color
, nie zapobiega koloryzacji (przetestowałem to również ja). Zaktualizowałem odpowiednio moją odpowiedźTwoje
l
ils
polecenia są ustawione jako aliasy.Kiedy je uruchomisz, potokujesz wyjście
grep "1"
(używając|
) każdą linię ekranu, w której się1
pojawia, jest wyświetlana, z1
czerwonym kolorem.Ponieważ nazwy plików
.
,..
,2
i22
pojawiają się na tej samej linii na ekranie, są one na wyjściugrep
jak dobrze, ale nie są wyświetlane w kolorze czerwonym, który pokazujegrep
meczów.:34m
Jest sekwencja ucieczki dla koloru, który nie maluje prawidłowo. Na podstawie zmienionego pytania z danymi wyjściowymitype -a l
itype -a
można je odtworzyć w moim systemie. Pamiętaj, że powinieneś zmienić swój alias z--color
na--color=auto
:Wyjście kolorów
źródło
1:34m
rzeczy nie są korupcja, są sekwencje używane do kolorowania tekstu. Zobacz moją odpowiedź z tej strony;)W swojej próbie wzywałeś swój
ls
alias, a więc1;34m
i podobny hałas pochodzący z kolorowania, a ponieważ rura|
odbiera to wszystko w tej samej linii,grep
dopasowuje plik1
z tej linii i w konsekwencji drukuje tę linię. Oto, co widzisz na ekranie.Kiedy robisz takie rzeczy, zawsze dobrze jest wrócić do polecenia systemowego z 1 wynikiem w wierszu.
Aby pozbyć się aliasów, po prostu wpisz
\ls
i użyj opcji,-1
aby wydrukować wyniki oddzielone wierszami.Uwaga: metoda odwrotnego ukośnika działa z każdym poleceniem,
\command
po prostu wywołuje niezmienne polecenie systemowe.źródło