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?
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.
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.)
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.