Ich denke, die meisten kennen den which
Befehl und ich benutze ihn häufig. Ich bin gerade in eine Situation geraten, in der ich neugierig bin, nicht nur welcher Befehl zuerst in meinem Pfad ist, sondern wie viele und wo alle Befehle in all meinen Pfaden sind. Ich habe versucht, auf welcher Manpage (Eingabe man which
hat mich zum Lachen gebracht), aber nichts gesehen.
19
which --all
.which -a
.Antworten:
Bei einigen Systemen werden
which -a
alle Übereinstimmungen angezeigt. Wenn Ihre Shell bash oder zsh¹ ist, können Sietype
stattdessen Folgendes verwenden :type foo
Zeigt die erste Übereinstimmung undtype -a foo
zeigt alle Übereinstimmungen an. Die drei Befehletype
,which
undwhence
tun meist die gleiche Sache; Sie unterscheiden sich zwischen Shells und Betriebssystemen in der Verfügbarkeit, den Optionen und dem, was sie genau melden.type
ist immer verfügbar und zeigt alle möglichen befehlsähnlichen Namen an (Aliase, Schlüsselwörter, integrierte Shell-Funktionen und externe Befehle).Die einzige vollständig portable Möglichkeit, alle Übereinstimmungen anzuzeigen, besteht darin, sich
$PATH
selbst zu analysieren . Hier ist ein Shell-Skript, das dies ausführt. Wenn Sie es sich um eine Shell - Funktion machen, stellen Sie sicher , dass die Funktion Körper in Klammern einzuschließen (so dass die ÄnderungIFS
undset -f
die Funktion nicht entgehen) und Änderungexit
zureturn
.¹ Oder ksh 93, laut Dokumentation, obwohl ksh 93s + 2008-01-31 nur die erste Übereinstimmung druckt, wenn ich es versuche.
quelle
sh
Code funktioniert nicht richtig, wenn leere Komponenten enthalten sind$PATH
. Beachten Sie auch , dass$IFS
ein Feld - Trennzeichen (in POSIX shells mindestens) , während in der$PATH
, Kolon als ein Feld verwendet wird Separator .which
Eine korrekte Implementierung finden Sie im Skript unter Debian.type
eingebauteksh93u+ 2012-08-01
scheint richtig zu funktionieren.Das Flag --all oder -a zeigt Ihnen alle Übereinstimmungen in Ihrem Pfad und Aliase (zumindest unter Fedora, Ubuntu und CentOS):
Unter AIX und Solaris erhalten Sie folgende Informationen:
quelle
$PATH
Leerzeichen oder Shell-Globbing-Zeichen enthalten sind.read -r
ist notwendig, um mit Backslashes fertig zu werden. Dies ist keine gute Methode, dafind
dies viel Zeit in$PATH
Anspruch nimmt und möglicherweise falsche Übereinstimmungen zurückgibt, wenn ein Verzeichnis in Unterverzeichnissen enthält. Zum Glückfind
ist hier nicht nützlich; Siehe meine Antwort.Wenn Sie keine
which
Unterstützung-a
haben oderwhence
verfügbar sind, rollen Sie Ihre eigenen:quelle
set -f
, um das Globbing auf dem ungeschützten Computer zu deaktivieren$PATH
.test -f
ist nicht ausreichend, da hier nur ausführbare Dateien gesucht werden; du brauchsttest -x
. Hmm, mir ist klar, dass ich den regulären Dateitest in meinem Skript vergessen habe.whence README.txt
so unwahrscheinlich wiewhence "file* wi?h we!rd name"
. Ich versuche nur zu zeigen, wie einfach das Überqueren ist$PATH
.ksh und zsh haben "wherece" als Shell eingebaut.
whence -a
macht was du willst unter zsh:Ich muss PATH in zsh bereinigen, ich habe viele Duplikate darin.
whence -a
funktioniert anders unter ksh:Ich muss sagen, das scheint auch ein potenziell nützliches Verhalten zu sein.
quelle