2013-08-13 8 views
29

Ich dachte, ich * nix-Rohre bis jetzt verstanden ... Ich habe eine ausführbare studio genannt, die ich symbolisch verlinkt installieren von Android Studio und ich hatte angenommen, ich könnte die Lage bekommen verbunden mitUnix Rohr in ls

which studio | ls -l 

Aber das funktioniert nicht. Was es mir gibt, ist gleichbedeutend damit, ls -l im aktuellen Verzeichnis gerade ausgeführt zu haben. Wenn ich which studio starte, bekomme ich /home/me/bin/studio. Und wenn ich ls -l /home/me/bin/studio laufen lasse, erhalte ich die erwartete Ausgabe, die mir den symlink Standort zeigt.

Warum funktioniert die Piped-Version nicht? Was habe ich nicht über Rohre gerochen?

Antwort

42

zu tun, dass Sie xargs brauchen:

which studio | xargs ls -l 

Von man xargs:

xargs - bauen und ausführen Befehlszeilen von der Standardeingabe

Um vollständig zu verstehen, wie Rohren arbeiten, Sie können lesen What is a simple explanation for how pipes work in BASH?:

Eine Unix-Pipe verbindet den STDOUT (Standardausgabe) -Dateideskriptor des ersten Prozesses mit dem STDIN (Standardeingabe) des zweiten. Was dann geschieht ist, dass, wenn der erste Prozess in seinen STDOUT schreibt, diese Ausgabe sofort (von STDIN) durch den zweiten Prozess gelesen werden kann.

16

ls liest seine Argumente nicht von der Standardeingabe, sondern von der Befehlszeile. Um das Verzeichnis in der Befehlszeile zu erhalten, müssen Sie die Befehlsersetzung verwenden:

ls -l "$(which studio)" 

(Die doppelten Anführungszeichen sind erforderlich, wenn der Pfad Leerzeichen enthalten könnte.)

+1

Die Antwort mit 'xargs' ist sauberer, aber das ehrt die Farbcodierung meiner Shell, was ein schöner Segen ist! – Dannid

1

Da ls -l übernimmt keine Eingabe, es tut nichts in Bezug auf die Ausgabe von which studio. Wichtig ist hier, den Unterschied zwischen Standardeingabe und Argumenten zu verstehen. Die Standardeingabe ist eine spezielle Datei, die mit der Prozedur scanf gelesen wird (z. B. von einem Programm in C). Die Argumente für ein Programm werden an die Hauptprozedur übergeben, wie die Parameter argv und argc. argv ist ein Array von null terminierten Arrays von char, und argc ist die Länge dieses Arrays.