Comme la plupart des utilisateurs, j'ai un tas d'alias configurés pour donner un ensemble d'indicateurs par défaut pour les 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 où mon vim
/grep
/ls
/etc vient, l'alias gêne :
$ which vim
vim: aliased to vim -X
C'est une sortie utile, mais pas ce que je recherche dans ce cas; Je connais vim
est aliasé à vim -X
mais je veux savoir où ça vim
vient.
À moins de ne pas définir temporairement l'alias juste pour que je puisse utiliser which
dessus, y a-t-il un moyen facile d'avoir which
"déballer" l'alias et s'exécuter dessus ?
Modifier : Il semble que which
est un shell intégré avec différents comportements à travers différents shells. Dans Bash, la suggestion de SiegeX du --skip-alias
drapeaux fonctionne ; cependant, je suis sur Zsh. Existe-t-il quelque chose de similaire ?
Réponse acceptée :
which
est en fait une mauvaise façon de faire des choses comme ça, car il fait des suppositions sur votre environnement basé sur $SHELL
et les fichiers de démarrage (il pense) que le shell utilise ; non seulement il se trompe parfois, mais vous ne pouvez 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, de sorte qu'il vous montre ce qui se passera réellement au lieu de ce qui se passerait lors d'une reconstruction de votre shell par défaut.
Dans ce cas, type -P
contournera tous les alias ou fonctions :
$ type -P vim
/usr/bin/vim
Vous pouvez également lui demander de décoller tous les calques, un à la fois, et vous montrer ce qu'il trouverait :
$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
(Développer cela à partir des commentaires :)
Le problème avec which
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 ou 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 dans zsh
mais apparemment pas bash
, il est plus susceptible d'utiliser l'environnement du shell et de faire ce qu'il faut.)
type
est une commande conforme à POSIX qui doit se comporter comme s'il s'agissait d'une commande intégrée (c'est-à-dire qu'elle doit utiliser l'environnement du shell à partir duquel elle est invoquée, y compris les alias et les fonctions locaux), donc elle est généralement un intégré.
Il ne se trouve généralement pas dans csh
/tcsh
, bien que dans la plupart des versions modernes de ceux which
est un shell intégré et fait ce qu'il faut; parfois l'intégré est what
à la place, et parfois il n'y a pas de bon moyen de voir l'environnement du shell actuel à partir de csh
/tcsh
du tout.