web-dev-qa-db-de.com

Unix-Leitung in ls

Ich dachte, ich verstehe bis jetzt * nix Pipes ... Ich habe eine ausführbare Datei namens studio, die symbolische Links zu meiner Installation von Android Studio enthält, und ich hatte angenommen, dass ich die verknüpfte Position erhalten könnte 

which studio | ls -l

Das geht aber nicht. Was es mir gibt, ist gleichbedeutend mit dem Ausführen von ls -l im aktuellen Verzeichnis.

Wenn ich which studio starte, erhalte ich /home/me/bin/studio. Wenn ich ls -l /home/me/bin/studio starte, erhalte ich die erwartete Ausgabe, die mir die Position des Symlinks anzeigt.

Warum funktioniert die Pipe-Version nicht? Was habe ich nicht über Pfeifen gesucht?

31
hcarver

Dazu benötigen Sie xargs:

which studio | xargs ls -l

Von man xargs:

xargs - Befehlszeilen aus Standardeingabe erstellen und ausführen

Um zu verstehen, wie Pipes funktionieren, können Sie lesen Was ist eine einfache Erklärung für Pipes in BASH? :

Eine Unix-Pipe verbindet den STDOUT-Dateideskriptor (Standardausgabe) von der erste Vorgang an die STDIN (Standardeingabe) des zweiten. Was passiert dann, wenn der erste Prozess in seinen STDOUT schreibt, das Die Ausgabe kann vom zweiten Prozess sofort (von STDIN) gelesen werden.

47
fedorqui

ls liest ihre Argumente nicht aus der Standardeingabe, sondern aus der Befehlszeile. Um das Verzeichnis in der Befehlszeile abzurufen, müssen Sie die Befehlsersetzung verwenden:

ls -l "$( which studio )"

(Die Anführungszeichen werden benötigt, wenn der Pfad Leerzeichen enthalten kann.)

20
choroba

Da ls -l keine Eingabe erfordert, wird nichts bezüglich der Ausgabe von which studio gemacht. Das Wichtigste dabei ist, den Unterschied zwischen Standardeingabe und Argumenten zu verstehen. Die Standardeingabe ist eine spezielle Datei, die mit der scanf-Prozedur gelesen wird (z. B. von einem Programm in C). Die Argumente für ein Programm werden als argv- und argc-Parameter an die Hauptprozedur übergeben. argv ist ein Array mit nullterminierten Arrays von char, und argc ist die Länge dieses Arrays.

0
lamg