Je pense que la plupart connaissent la which
commande et je l'utilise fréquemment. Je suis juste tombé sur une situation où je suis curieux non seulement de savoir quelle commande est la première sur mon chemin, mais combien et où se trouvent toutes les commandes dans tous mes chemins. J'ai essayé la page de manuel which (la frappe man which
m'a fait rire), mais je n'ai rien vu.
19
which --all
.which -a
.Réponses:
Sur certains systèmes,
which -a
affiche toutes les correspondances. Si votre shell est bash ou zsh¹, vous pouvez utiliser à latype
place:type foo
affiche la première correspondance ettype -a foo
affiche toutes les correspondances. Les trois commandestype
,which
etwhence
font principalement la même chose; ils diffèrent entre les shells et les systèmes d'exploitation en termes de disponibilité, d'options et de ce qu'ils rapportent exactement.type
est toujours disponible et affiche tous les noms possibles de type commande (alias, mots clés, fonctions intégrées du shell, fonctions et commandes externes).La seule façon entièrement portable d'afficher toutes les correspondances est de
$PATH
vous analyser . Voici un script shell qui fait cela. Si vous en faites une fonction shell, assurez-vous de placer le corps de la fonction entre parenthèses (afin que la modification passe à la fonctionIFS
etset -f
n'échappe pas à celle-ci), puis changezexit
enreturn
.¹ Ou ksh 93, selon la documentation, bien que ksh 93s + 2008-01-31 n'imprime que la première correspondance lorsque j'essaye.
la source
sh
code ne fonctionne pas correctement s'il y a des composants vides dans$PATH
. Notez également qu'il$IFS
s'agit d'un délimiteur de champ (dans les shells POSIX au moins) tandis que dans$PATH
, le signe deux-points est utilisé comme séparateur de champ . Voir lewhich
script trouvé sur Debian pour une implémentation correcte.type
intégréeksh93u+ 2012-08-01
semble fonctionner correctement.Le drapeau --all ou -a vous montrera toutes les correspondances sur votre chemin et les alias (au moins sur Fedora, Ubuntu et CentOS):
Sous AIX et Solaris, cela vous rapprochera:
la source
$PATH
contient des espaces ou des caractères globbing shell.read -r
est nécessaire pour faire face aux barres obliques inverses. Ce n'est pas une bonne méthode carfind
cela prendra du temps et peut retourner des correspondances parasites si un répertoire dans$PATH
contient des sous-répertoires. Heureusement,find
n'est pas utile ici; voir ma réponse.Si vous n'avez pas de
which
support-a
ouwhence
disponible, lancez le vôtre:la source
set -f
pour désactiver le globbing sur le non protégé$PATH
.test -f
n'est pas suffisant car seuls les fichiers exécutables sont recherchés ici; vous avez besointest -x
. Hmm, je réalise que j'ai oublié le test de fichier normal dans mon script.whence README.txt
aussi peu probable quewhence "file* wi?h we!rd name"
. J'essaie juste de montrer à quel point il est facile de traverser$PATH
.ksh et zsh ont "d'où" un shell intégré.
whence -a
fait ce que vous voulez sous zsh:Je dois nettoyer PATH dans zsh, j'ai beaucoup de doublons dedans.
whence -a
fonctionne différemment sous ksh:Je dois dire que cela semble également être un comportement potentiellement utile.
la source