Shell - Wie finde ich das Verzeichnis eines Befehls?

127

Ich weiß, dass wenn Sie sich in der Shell befinden, die einzigen Befehle verwendet werden können, die in einem Verzeichnis gefunden werden können, das auf PATH festgelegt ist. Auch wenn ich nicht weiß, wie ich sehen soll, welche Verzeichnisse in meiner PATH-Variablen enthalten sind (und dies ist eine weitere gute Frage, die beantwortet werden könnte), möchte ich Folgendes wissen:

Ich komme zu Shell und schreibe:

$ lshw

Ich möchte einen Befehl auf der Shell wissen, der mir sagen kann, wo sich dieser Befehl befindet. Mit anderen Worten, wo befindet sich diese "ausführbare Datei"?

Etwas wie:

$ location lshw
/usr/bin

Jemand?

Gabriel L. Oliveira
quelle

Antworten:

187

Wenn Sie Bash oder zsh verwenden, verwenden Sie Folgendes:

type -a lshw

Dies zeigt, ob das Ziel eine integrierte, eine Funktion, ein Alias ​​oder eine externe ausführbare Datei ist. In letzterem Fall wird jeder Ort angezeigt, an dem er in Ihrem angezeigt wird PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

In Bash wird für Funktionen type -aauch die Funktionsdefinition angezeigt. Sie können declare -f functionnamedas Gleiche tun (das müssen Sie für zsh verwenden, da type -adies nicht der Fall ist).

Bis auf weiteres angehalten.
quelle
Vielen Dank an alle, die geantwortet haben, aber diese Antwort war die aufregendste! Danke dir! Ich dachte, dass ich verrückt bin, weil ich (vor langer Zeit) einen Weg definiert habe, dies zu tun: 'update', und dies hat 'apt-get update' durchgeführt; apt-get dist-upgrade 'für mich. Aber im Moment habe ich versucht, irgendwo eine update.sh-Datei zu finden, und ich konnte sie nicht finden. Deshalb habe ich diese Frage angefangen. Aber jetzt, als ich 'type -a update' verwendete, stellte ich fest, dass dies nur ein Alias ​​war, der in meiner .bashrc definiert war, die sich auf meiner ~ home befand. Wirklich danke dir.
Gabriel L. Oliveira
1
@ Gabriel: Wenn Sie nicht damit vertraut sind locate, können Sie Dateien finden. Es wird eine Datenbank verwendet, die verwaltet updatedbwird und von einem Cron-Job ausgeführt wird. Da locateeine Datenbank und nicht das gesamte Dateisystem durchsucht wird, ist dies viel schneller als find(was als letzter Ausweg verwendet werden könnte).
Bis auf weiteres angehalten.
Danke dir. Ich werde dieses Tool studieren und sehen, wie aktualisiertb auf Ubuntus Cronjob ausgeführt werden soll.
Gabriel L. Oliveira
Manchmal type -akann es verwirrend sein. zB für den Fall, nvmdass es sich um eine Bash-Funktion handelt, die ich type -a nvm | head -n1ausführen musste : um herauszufinden, was genau ist nvm.
Marinos An
@MarinosAn: Gibt für Funktionen type -adie Funktionsdefinition sowie den Typ der ausführbaren Datei aus. Das Risiko bei der Verwendung headbesteht darin, dass bei Namen mit mehr als einem Typ die zusätzlichen Typen nicht ausgegeben werden. Vielleicht möchten Sie sich ansehen type -t.
Bis auf weiteres angehalten.
64

So was:

which lshw

So zeigen Sie alle Befehle an, die in Ihrem Pfad übereinstimmen:

which -a lshw 
Ignacio Vazquez-Abrams
quelle
7
auch welche -a lshw, um alle Befehle zu sehen, die in Ihrem Pfad übereinstimmen.
AlG
Ich glaube, das funktioniert nur mit Befehlen (ausführbare Dateien auf dem $ PATH), nicht mit Funktionen.
Olivier Lacan
whichist problematisch, weil es mehrere Implementierungen gibt, von denen viele völlig falsch sind und andere gut zu funktionieren scheinen, aber seltsame Überraschungen haben. Sie sollten typestattdessen bevorzugen .
Tripleee
Funktioniert nicht für Aliase und Bash-Funktionen. Zumindest auf Ubuntu. Bessere Verwendungtype -a lshw
Marinos An
17

PATH ist eine Umgebungsvariable und kann mit dem Befehl echo angezeigt werden:

echo $PATH

Es ist eine Liste von Pfaden, die durch das Doppelpunktzeichen ' :' getrennt sind.

Der whichBefehl gibt an, welche Datei ausgeführt wird, wenn Sie einen Befehl ausführen:

which lshw

Manchmal erhalten Sie einen Pfad zu einem Symlink. Wenn Sie diesen Link dahin verfolgen möchten, wo sich die eigentliche ausführbare Datei befindet, können readlinkSie folgende Ausgabe verwenden und füttern which:

readlink -f $(which lshw)

Der -fParameter weist readlinkan, dem Symlink weiterhin rekursiv zu folgen.

Hier ist ein Beispiel von meiner Maschine:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
hasen
quelle
5
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz
Jack
quelle
3

In der TENEX C-Shell tcsh können Sie die Position (en) eines Befehls auflisten oder, wenn es sich um einen integrierten Befehl handelt, den folgenden whereBefehl verwenden:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd
Pierz
quelle
0

Die Korn-Shell kshbietet die whenceintegrierte Shell, die andere integrierte Shell-Shell, Makros usw. identifiziert. Der whichBefehl ist jedoch portabler.

mpez0
quelle
1
In ksh whence -aist ähnlich wie bei Bash type -a.
Bis auf weiteres angehalten.
0

Eine Alternative zu type -aistcommand -V

Da ich mich meistens nur für das erste Ergebnis interessiere, pfeife ich auch vom Kopf. Auf diese Weise wird der Bildschirm im Falle einer Bash-Funktion nicht mit Code überflutet.

command -V lshw | head -n1
Marinos An
quelle