2014-02-28 13 views
5

ist folgendes zu beachten ..., wenn ich ohne Flags ‚ls‘ ausführen, ist es, die Ergebnisse in einer einzigen Zeile zurückgibt, wie folgt aus:ändert Pipe Operator seine Eingabe/Ausgabe? Oder ist mir Rohr bewusst?

[email protected] /cygdrive/c/test/ 
$ ls 
folder1/ folder2/ folder3/ 

jetzt, wenn ich die Ergebnisse für etwas grep wollen, sag '2', bekomme ich folgendes:

[email protected] /cygdrive/c/test/ 
$ ls | grep 2 
folder2/ 

Sollte es nicht die gesamte Linie zurückgeben? Ich würde erwarten, dieses Ergebnis habe ich ls -l | grep 2 verwendet.

Es scheint mir, dass entweder der Pipe-Operator die Eingabe in grep in irgendeiner Weise ändert oder dass ls irgendwie die Pipe erkennt und ihre eigene Ausgabe ändert.

ist eine einzelne Zeichenfolge, nicht wahr? also wie dann grep wissen, nur folder2/, und nicht folder1/ folder2/ folder3/ zurückgeben?

+0

Ich habe mich schon lange darüber gewundert. Es scheint, dass ls sich bewusst ist, dass seine Ausgabe zu einer Pipe geht, und formatiert so jedes Ergebnis als separate Zeile. Wenn das Terminal ausgegeben wird, wird es kompakter formatiert. Ich weiß nicht, ob das "offizielle" Verhalten oder nur eine Konvention ist. –

Antwort

4

Die Manpage für ls, nämlich das Flag -1: (. Die numerische Ziffer `` ein '')

-1 Kraftausgang ein Eintrag pro Linie. Dies ist die Standardeinstellung, wenn die Ausgabe nicht an ein Terminal erfolgt.

Wenn Sie Ausgabe mehrspaltigen Verwendung erzwingen

-C Kraft mehrspaltigen Ausgang; Dies ist der Standardwert, wenn die Ausgabe an ein Terminal ist.

Also um Ihre Frage zu beantworten, ja, ls ist bewusst wo der Ausgang geht und es hat gut definierte Verhalten auf sich je nachdem, welche Sie leicht außer Kraft setzen können.

+1

sehr interessant ... Ich habe das auch gefunden, das erklärt [wie ls ist Pipe bewusst] (http://www.ginac.de/~krekel/fileno/). Es scheint, dass es Isatty verwendet, um den Dateideskriptor zu testen und seine Ausgabe abhängig davon zu verändern, was es schreibt - was mich fragen lässt, wie es bei Cygwin funktioniert: P – ash

+0

Vermutlich ist die Cygwin-Implementierung von 'ls' anders. Der POSIX-Standard erfordert eine Datei pro Zeile, es sei denn, eine Option ändert dies explizit, oder wenn die Ausgabe an ein Terminal gesendet wird (in diesem Fall ist die Ausgabe implementierungsdefiniert). – chepner