Wie das Bild zeigt, benutze ich l
, um die Datei in den aktuellen Ordner zu bekommen. Und dann möchte ich die Datei mit der Nummer bekommen 1
, also benutze ich die pipe
und die grep
.
Aber warum zeigen die 2
und 22
Datei aus? Und was ist das 1;34m
?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
Aktualisieren
Ich habe bereits einen Alias für den Befehl l
in meiner zshrc
Datei.
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
Und hier ist das Ergebnis des type
Befehls:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
command-line
grep
ls
pipe
Lee
quelle
quelle
type -a l
?type ls
Befehls bitte zu posten ? Haben Sie denls
Alias in irgendeiner Weise geändert ?Antworten:
Zuallererst ist das, was du versuchst,
l| grep <filename>
schlecht. Tu es nicht. Hier ist der Grund.l
Befehl ist wirklich ein Alias fürls -CF
Standardmäßig in Ubuntu
bash
,ls
ist ein Alias zuls --color=auto
. Wie steeldriver in den Kommentaren hervorhob,--color=auto
soll die Einfärbung ausgeschaltet werden. In Ihrem speziellen Fall haben Siealias ls="ls -alh --color"
undalias l="ls -CF"
, was im Grunde genommen dazu führt, dassls -alh --color -CF
. Diese spezielle Schalterkombination sendet immer noch farbige Ausgaben über eine Pipe. Beispielsweise:Beachten Sie, wie die
.
und..
Verzeichnisse haben gleiche Escape - Sequenzen.Was bedeutet das alles?
Dies bedeutet, dass
l
eine farbige Liste der Dateien nach Dateityp ausgegeben wird. Das Problem ist, dass die Einfärbung unter Verwendung von Escape-Sequenzen erfolgt . Das ist, was1:34m
Dinge sind - sie sind Fluchtsequenzen für bestimmte Farben.Das Hauptproblem ist, dass das Parsen
ls
in Skripten oft zu falschen Ausgaben und zum Absturz von Skripten führt, einfach weills
Escape-Sequenzen wie oben erläutert und andere Sonderzeichen möglich sind. Weitere Informationen finden Sie in diesem Artikel: http://mywiki.wooledge.org/ParsingLsWas solltest du tun:
Verwenden
find
Befehl ein :Sie könnten so etwas mit Shell Glob und modernen Testbefehlen machen
[[
:Oder verwenden Sie Python, das eine weitaus bessere Dateibehandlung bietet als
bash
alleinWenn die Ausgabe von nicht verarbeitet werden muss, kann auch das
ls
einfache Verschieben mitls
die Arbeit erledigen. (Denken Sie daran, dies ist nur zum Anzeigen einer Liste von Dateien gedacht, nicht zum Weitergeben an ein anderes Programm, um den ausgegebenen Text zu verarbeiten.)quelle
--color=always
auch angegeben ist - entweder als Teil des Alias fürl
oder in einem vorherigen Alias für sichls
selbst (anstelle des Standardwertsalias ls='ls --color=auto'
).ls
in Bash standardmäßig ist?type ls
gibt mir, dass es einls --color=auto
auto
deaktiviert aber die Farbe in einer Pipe AFAIK. Sehen ANSI - Farbsequenzen zu sein, müssen sie geändert wurden--color=always
, entweder in demls
Alias oderl
Aliasls --color
nicht die Einfärbung (das habe ich auch selbst getestet). Meine Antwort wurde entsprechend aktualisiertIhre Befehle
l
undls
werden als Aliase eingerichtet.Wenn Sie sie ausführen, leiten Sie die Ausgabe durch
grep "1"
(mit|
) jede Bildschirmzeile, in1
der angezeigt wird, mit der1
Farbe Rot.Da Dateinamen
.
,..
,2
und22
auf der gleichen Bildschirmzeile erscheinen, sie sind ausgegeben durchgrep
und erscheinen aber nicht in rot , die zeigt ,grep
Streichhölzer.Dies
:34m
ist eine Escape-Sequenz für eine Farbe, die nicht richtig gemalt wird. Gestützt auf Ihre überarbeitete Frage mit der Ausgabe vontype -a l
undtype -a
es kann in meinem System reproduziert werden. Bitte beachten Sie, dass Sie Ihren Alias von--color
in ändern sollten--color=auto
:Farbausgabe
quelle
1:34m
Dinge sind keine Korruption, sondern Escape-Sequenzen, die zum Einfärben von Text verwendet werden. Siehe meine Antwort auf diesen Teil;)In Ihrem Versuch haben Sie Ihren
ls
Aliasnamen genannt, also das1;34m
und ähnliche Rauschen, das von der Färbung herrührt, und da die Pipe|
all dies in derselben Zeile empfängt,grep
stimmt das mit der Datei1
aus dieser Zeile überein und druckt folglich diese Zeile. Dies sehen Sie auf dem Bildschirm.Wenn Sie so etwas tun, ist es immer gut, mit 1 Ergebnis pro Zeile zum Systembefehl zurückzukehren.
Um Aliase zu entfernen, geben Sie einfach ein
\ls
und verwenden Sie die Option-1
, um die Ergebnisse durch Zeilenvorschübe getrennt zu drucken.Hinweis: Die Backslash-Methode funktioniert mit jedem Befehl. Sie
\command
ruft nur den unaliasierten Systembefehl auf.quelle