Comme la plupart des utilisateurs, de nombreux alias ont été configurés pour donner un ensemble d'indicateurs par défaut aux programmes fréquemment utilisés. Par exemple,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Le problème est que si je veux utiliser which
pour voir d'où vient mon vim
/ grep
/ ls
/ etc, le pseudonyme est un obstacle:
$ which vim
vim: aliased to vim -X
C'est une sortie utile, mais pas ce que je recherche dans ce cas; Je sais que vim
c'est un alias, vim -X
mais je veux savoir d'où ça vim
vient.
À moins que l’alias ne soit temporairement non défini pour que je puisse l’utiliser which
, existe-t-il un moyen facile d’avoir which
«déballé» l’alias et de s’exécuter lui-même?
Edit: Il semble que ce which
soit un shell intégré avec des comportements différents selon les différents shells. Dans Bash, la suggestion du --skip-alias
drapeau par SiegeX fonctionne; Cependant, je suis sur Zsh. Quelque chose de semblable existe-t-il?
vim
vient , vous pouvez utiliserwhere vim
Réponses:
which
est en fait une mauvaise façon de faire des choses comme ça, car cela permet de deviner votre environnement en fonction$SHELL
des fichiers de démarrage (il pense) que le shell utilise; non seulement cela donne-t-il parfois tort, mais on ne peut généralement pas lui dire de se comporter différemment. (which
sur mon Ubuntu 10.10 ne comprend pas,--skip-alias
comme mentionné par @SiegeX, par exemple.)type
utilise l’environnement shell actuel au lieu de fouiller dans vos fichiers de configuration, et on peut lui dire d’ignorer des parties de cet environnement, ce qui vous montre ce qui se passera réellement. arriver au lieu de ce qui se passerait dans une reconstruction de votre shell par défaut.Dans ce cas,
type -P
ignorera tous les alias ou fonctions:Vous pouvez également lui demander de retirer toutes les couches, une à la fois, et de vous montrer ce qu'il trouverait:
(En développant ceci à partir des commentaires :)
Le problème,
which
c'est qu'il s'agit généralement d'un programme externe au lieu d'un shell intégré, ce qui signifie qu'il ne peut pas voir vos alias ni vos fonctions et doit essayer de les reconstruire à partir des fichiers de démarrage / configuration du shell. (Si c'est un shell intégré, comme c'est le cas,zsh
mais apparemment pasbash
, il est plus susceptible d'utiliser l'environnement du shell et de faire la bonne chose.)type
est une commande compatible POSIX qui doit se comporter comme si elle était intégrée (c’est-à-dire qu’elle doit utiliser l’environnement du shell dans lequel elle est invoquée, y compris les alias et les fonctions locaux); elle est donc généralement intégrée.Il ne se trouve généralement pas dans
csh
/tcsh
, bien que, dans la plupart des versions modernes, il s’agisse d’which
un shell intégré qui fait le bon choix; parfois intégré est auwhat
lieu, et parfois il n'y a pas de bonne façon de voir l'environnement de l'interpréteur de commandes actuel decsh
/tcsh
du tout.la source
type -a
semble renvoyer toutes les instances sur votre$PATH
, pas seulement le premier. Je pense que je vais aliaswhich
totype
:)type
fait partie de la norme POSIX, c’est la voie à suivre. Pour répondre à ma question, tapez works sur zsh également (sur Debian). Pourquoi les distributions ne se débarrassent -elles paswhat
etwhich
si elles ne sont pas normalisées et ne disposent pas de fonctionnalités supplémentaires?info bash 'Bash builtins'
Linux, bien que vous puissiez également l’obtenir à partir duzsh
manuel de référence. Plus officiellement, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (que je remarque ne spécifie pas réellement-P
ou-a
, ou même-p
qui était la forme originale de-P
, mais exige qu'il utilise l'environnement shell actuel).type -p
se comporte différemment entre zsh et bash.type -P
n'existe pas du tout dans zsh.Dans
bash
:Dans
zsh
:À la fois:
Ou:
la source
En zsh
which
est intégré car cette commande indique:Pour exécuter la commande externe (dans n’importe quel shell)
which
, utilisez le chemin complet :la commande
ls
a donc été trouvée (une valeur de sortie de 0) et se trouve à/bin/ls
.À l'intérieur
zsh
; Un moyen (à côté de celui ci-dessus) de rechercher des commandes externes est:Cependant, cela ne résoudra pas les alias imbriqués tels que:
La commande signalera qu'aucune
dire
commande n'a été trouvée.Pour résoudre les alias imbriqués (manuellement), voir
Resolve nested aliases to their source commands
la source
Mine définie comme telle
la source
Essayez ce qui suit:
la source
which
fait d'un shell intégré et non d'un utilitaire Unix standard, comme je l'avais supposé. Je devrais donc modifier ma question et spécifier Zsh. Merci de me l'avoir signalé!which
n'est pas intégré, du moins pas sur Debian. C'est un script shell, et une partie de debianutils, fonctionne donc sur zsh. Cependant,--skip-alias
n’est pas une optionwhich
sur Debian. Existe-t-il différentes variétés dewhich
flottants? Cela ne semble pas être une commande normalisée.man zshbuiltins
. quel nom [-wpams] ... Équivalent à whence -c.bash
, ce n'est pas intégré et n'a pas l'--skip-alias
option./usr/bin/which
et d’un alias/etc/profile.d
qui lui permet de gérer les alias mais--skip-alias
fonctionne. En conséquence,which which
affiche l'alias, maiscommand which which
affiche l'exécutable!Une autre alternative est
command which vim
, qui fonctionne de la même manière à la foiszsh
etbash
Par exemple sur mon mac:
la source
Les deux
type
etwhich
se comportent différemment selon votre type de shell.Dans bash,
which
est une commande existe dansPATH
. Il recherche la commande que vous fournissezPATH
. Bash builtintype -P
(P pourPATH
) se comporte exactement commewhich
.Dans ZSH, les deux
which
ettype
sont des fonctions intégrées et des fonctions partielles de la fonction intégréewhence
.which -p
c'est ce que tu veux. Cela force une recherche de chemin. (l'-P
option n'est pas disponible pourtype
ZSH.)Plus de manuel de ZSH.
Pour ignorer
builtin
which
et forcer l'utilisation de la commandewhich
dePATH
ZSH:la source