Gibt es eine Bash-Funktion für "welche"?

16

Ich habe eine minimale Fedora-Installation getestet. Um den Pfad nach Interpreten wie Python oder Node zu überprüfen, verwende ich normalerweise which.

Ich stelle fest, dass whichnicht standardmäßig installiert ist. Ich könnte das Paket hinzufügen, aber ich frage mich, ob es eine integrierte Shell gibt, mit der diese allgemeine Aufgabe ausgeführt werden kann.

Ich benutze Bash 4.2.

Mikemaccana
quelle
1
Irgendwie brachte mich eine Suche nach dem Windows-Äquivalent hierher; Für zukünftige Betrachter: "where" gibt den Pfad der angegebenen Datei an.
Rubber Duck
1
Ich ermutige jeden, der auf dieses Q stößt, auch dieses U & L Q & A zu lesen. Es deckt alles ab, was Sie schon immer wissen wollten which. Warum nicht "welches" verwenden? Was ist dann zu verwenden?
Slm

Antworten:

26

Du kannst folgendes benutzen type, welches ein Bash ist:

$ type -P which
which is /usr/bin/which

Dokumentation finden Sie unter help [t]ype, der auf den typeAbschnitt in der bashManpage verweist .

( help typedruckt die Hilfeseiten für zwei Builtins, die mit der Zeichenfolge "type" beginnen, von denen eine veraltet ist und in keinerlei Beziehung dazu steht.)

l0b0
quelle
3
Ich mag type -amich. Warum die Klammern [t]ype?
Glenn Jackman
type -aGibt alle Dinge aus, auf die das Argument verweist, und nicht nur, was ausgeführt wird, wenn es eingegeben wird.
l0b0
2
Ich ermutige jeden, der auf dieses Q stößt, auch dieses U & L Q & A zu lesen. Es deckt alles ab, was Sie schon immer wissen wollten which. Warum nicht "welches" verwenden? Was ist dann zu verwenden?
Slm
Das Erste in der Liste von type -aist immer, was es ausführen würde. Ich mache das gleiche wie Glenn und benutze type -aes immer auch.
Slm
1
type -pZeigt den Pfad nicht an, wenn der Befehl ein Alias ​​ist. type -PZeigt den Befehlspfad immer richtig an. Meiner Ansicht nach. Wir sollten die akzeptierte Antwort als type -P@ l0b0
dirigeant
10

Sie können typeoder verwenden command -v. Die Ausgabe von typeist vom Menschen lesbar; Die Ausgabe von command -vkann von Bash ausgeführt werden.

Beachten Sie, dass sie tatsächlich ein bisschen anders sind. typeund commandsuchen Sie den Hash-Wert des Befehls. Das heißt, wenn Sie schreiben cmd, type cmdoder command -v cmdwird Ihnen genau sagen , was laufen wird. Sie können auch Aliase, Bash-Funktionen und Bash-Builtins bearbeiten (obwohl type -pdiese ignoriert werden und nur echte Dateien zurückgegeben werden).

whichSucht einfach nach dem Pfad. Das ist anders, weil:

  • Wenn es einen Alias, eine Funktion oder ein Built-In mit demselben Namen gibt, wird dieser stattdessen aufgerufen.
  • Wenn ein Befehl früher im PATH hinzugefügt wurde, seit er das letzte Mal gehasht wurde, wird er von gefunden which, aber wenn Sie diesen Befehl ausführen, wird der Hash-Wert verwendet (Sie können erzwingen, dass der Hash in Bash mit aktualisiert wird hash -r).

Normalerweise wollen die Leute wirklich type, whichzumindest nicht für den interaktiven Gebrauch, indem sie herausfinden, "woher dieser Befehl kommt, wenn ich ihn ausführe?" Sie sollten nur verwenden, whichwenn Sie wirklich eine PATH-Suche durchführen möchten.

Asmeurer
quelle
command -vist das Äquivalent von ksh whence.
Henk Langeveld
1
So haben wir where, whenceund natürlich auch who, whyund when? Warum gibt es keine what?
Hagen von Eitzen
echo 'main(){printf("what\n");}' | sudo cc -x c - -o /usr/local/bin/what
Ivan Vučica