Ich denke, ich kann einen relativ grundlegenden Punkt in Bezug auf Shell übersehen. Die Ausgabe des Befehls ls trennt die Ausgabe standardmäßig durch Zeilenumbrüche, die Shell zeigt die Ausgabe jedoch in einer einzelnen Zeile an.
Kann mir das jemand erklären? Ich hatte immer angenommen, dass die Ausgabe einfach durch Leerzeichen getrennt ist, aber jetzt, da ich die Ausgabe durch Zeilenumbrüche getrennt sehe, würde ich erwarten, dass die Ausgabe in separaten Zeilen angezeigt wird.
Beispiel:
cpoweradm@debian:~/lpi103-4$ ls text*
text1 text2 text3
od zeigt an, dass die Ausgabe durch Zeilenumbrüche getrennt ist:
cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000 t e x t 1 \n t e x t 2 \n t e x t
0000020 3 \n
0000022
Wenn Zeilenumbrüche vorhanden sind, wird die Ausgabe dann nicht wie folgt angezeigt:
text1
text2
text3
ls
. Es ist nützlich, aber eindeutig inkonsistent und überraschend. Beachten Sie jedoch, dass einige Befehle, die eine farbige Ausgabe erzeugen, die Farben auch bei der Pipe-Verarbeitung entfernen.ls
immer eine pro Zeile undlc
immer in Spalten gedruckt.dpkg -l
die gesamte Breite des Bildschirms verwendet, aber wenn es in einer Pipe gedruckt wird, wird davon ausgegangen, dass das Terminal 80 Spalten breit ist , und kürzt die Ausgabe ab, um sie bei Bedarf anzupassen.Ihre Entdeckung zeigt den Hauptgrund auf, warum das Parsen der Ausgabe
ls
immer eine schlechte Idee ist. Eine vollständige Erklärung finden Sie in Gregs Wiki .Denken Sie umgekehrt an Ihr Problem. Sie haben bemerkt, dass ls manchmal Zeilenumbrüche zwischen den Ausgaben druckt und manchmal nicht. Für die Verwendung in Skripten oder wenn es durch das
-1
Flag erzwungen wird . Eine neue Zeile am Ende jeder Datei. Was gibt es keine Garantie, dass jede Zeile einen neuen Dateinamen darstellt . Wenn ein Dateiname eine neue Zeile enthält, kann die Ausgabe von ls nicht analysiert werden. Betrachten Sie diese Dateinamen:Wenn Sie
ls -1
ein Verzeichnis mit dem darin haben, würden Sie etwas bekommen, das so aussieht:Würden Sie nicht natürlich davon ausgehen, dass es vier Dateien gibt? Dies gilt auch für Skripte, die die Ausgabe von ls analysieren. In Wirklichkeit gibt es drei Dateien, eine davon mit einem kniffligen Namen, aber Sie könnten das nicht aus der Ausgabe von ls herausfinden. *
* Es sei denn, Sie haben das
-l
Flag verwendet und festgestellt, dass die Ausgabe nicht mehr funktioniert, Ihre Skripte jedoch immer noch blockiert sind.quelle
ls
, kann die-b
Option helfen. Es macht die Newline in\n
usw.