Shell - Comment trouver le répertoire d'une commande?

127

Je sais que lorsque vous êtes sur shell, les seules commandes qui peuvent être utilisées sont celles qui peuvent être trouvées sur certains répertoires définis sur PATH. Même je ne sais pas comment voir quels répertoires se trouvent sur ma variable PATH (et c'est une autre bonne question à laquelle on pourrait répondre), ce que j'aimerais savoir c'est:

Je viens décortiquer et écrire:

$ lshw

Je veux connaître une commande sur le shell qui peut me dire où se trouve cette commande. En d'autres termes, où se trouve ce "fichier exécutable"?

Quelque chose comme:

$ location lshw
/usr/bin

N'importe qui?

Gabriel L. Oliveira
la source

Réponses:

187

Si vous utilisez Bash ou zsh, utilisez ceci:

type -a lshw

Cela montrera si la cible est une fonction intégrée, une fonction, un alias ou un exécutable externe. Si ce dernier, il affichera chaque endroit où il apparaît dans votre fichier 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

Dans Bash, pour les fonctions type -aaffichera également la définition de la fonction. Vous pouvez utiliser declare -f functionnamepour faire la même chose (vous devez l'utiliser pour zsh, car ce type -an'est pas le cas).

Suspendu jusqu'à nouvel ordre.
la source
Merci à tous ceux qui ont répondu, mais cette réponse était la plus excitante! Je vous remercie! Je pensais que je suis fou, parce que j'ai défini (il y a longtemps) un moyen de faire ceci: 'update', et cela a été fait 'apt-get update; apt-get dist-upgrade 'pour moi. Mais pour l'instant, j'essayais de trouver un fichier update.sh quelque part, et je ne pouvais pas le trouver. C'est pourquoi j'ai commencé cette question. Mais maintenant, en utilisant 'type -a update', j'ai trouvé que c'était juste un alias défini sur mon .bashrc situé sur mon ~ home. Vraiment merci.
Gabriel L. Oliveira
1
@Gabriel: Si vous ne le connaissez pas, locateil peut vous aider à trouver des fichiers. Il utilise une base de données gérée par updatedblaquelle est exécutée à partir d'un travail cron. Puisque locaterecherche dans une base de données plutôt que dans tout le système de fichiers, c'est beaucoup plus rapide que find(ce qui pourrait être utilisé en dernier recours).
Suspendu jusqu'à nouvel ordre.
Je vous remercie. Je vais étudier cet outil et voir comment updatedb est prévu pour s'exécuter sur le cronjob d'Ubuntu.
Gabriel L. Oliveira
Parfois, cela type -apeut prêter à confusion. par exemple dans le cas de nvmlaquelle est une fonction bash que je devais faire: type -a nvm | head -n1pour savoir ce que c'est exactement nvm.
Marinos An
@MarinosAn: pour les fonctions, génère type -ala définition de la fonction ainsi que le type d'exécutable. Le risque avec l'utilisation headest que dans le cas de noms avec plus d'un type, les types supplémentaires ne seront pas affichés. Vous voudrez peut-être regarder type -t.
Suspendu jusqu'à nouvel ordre.
64

Comme ça:

which lshw

Pour voir toutes les commandes qui correspondent à votre chemin:

which -a lshw 
Ignacio Vazquez-Abrams
la source
7
également quel -a lshw pour voir toutes les commandes qui correspondent à votre chemin.
AlG
Je crois que cela ne fonctionne qu'avec des commandes (exécutables sur le $ PATH), pas des fonctions.
Olivier Lacan
whichest problématique car il existe plusieurs implémentations, dont beaucoup font complètement la mauvaise chose, et d'autres semblent bien fonctionner, mais ont d'étranges surprises. Vous devriez typeplutôt préférer .
tripleee
Ne fonctionne pas pour les alias et les fonctions bash. Au moins sur ubuntu. Meilleure utilisationtype -a lshw
Marinos An
17

PATH est une variable d'environnement, et peut être affichée avec la commande echo:

echo $PATH

C'est une liste de chemins séparés par le caractère deux-points ' :'

La whichcommande vous indique quel fichier est exécuté lorsque vous exécutez une commande:

which lshw

parfois ce que vous obtenez est un chemin vers un lien symbolique; si vous souhaitez tracer ce lien jusqu'à l'emplacement de l'exécutable réel, vous pouvez utiliser readlinket lui fournir la sortie de which:

readlink -f $(which lshw)

Le -fparamètre indique readlinkde continuer à suivre le lien symbolique de manière récursive.

Voici un exemple de ma machine:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
hasen
la source
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
la source
3

Dans le TENEX C Shell, tcsh , on peut lister le (s) emplacement (s) d'une commande, ou s'il s'agit d'une commande intégrée, en utilisant la wherecommande par exemple:

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

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

Le shell Korn,, kshpropose le module whenceintégré, qui identifie les autres modules internes du shell, les macros, etc. La whichcommande est cependant plus portable.

mpez0
la source
1
En ksh, whence -aest similaire à celui de Bash type -a.
Suspendu jusqu'à nouvel ordre.
0

Une alternative à type -aestcommand -V

Puisque la plupart du temps je ne m'intéresse qu'au premier résultat, je pipe aussi de la tête. De cette façon, l'écran ne sera pas inondé de code en cas de fonction bash.

command -V lshw | head -n1
Marinos An
la source