Come la maggior parte degli utenti, ho un sacco di alias impostati per fornire un set predefinito di flag per i programmi utilizzati di frequente. Ad esempio,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Il problema è che se voglio usare which
per vedere dove sono i miei vim
/grep
/ls
/etc proviene da, l'alias si intromette:
$ which vim
vim: aliased to vim -X
Questo è un output utile, ma non quello che sto cercando in questo caso; Conosco vim
è alias di vim -X
ma voglio sapere dove quello vim
proviene da.
A meno di non definire temporaneamente l'alias solo così posso usare which
su di esso, c'è un modo semplice per avere which
"srotolare" l'alias ed eseguirlo da solo?
Modifica: Sembra che which
è una shell incorporata con comportamenti diversi su diverse shell. In Bash, il suggerimento di SiegeX del --skip-alias
lavori di bandiera; tuttavia, sono su Zsh. Esiste qualcosa di simile lì?
Risposta accettata:
which
in realtà è un brutto modo per fare cose del genere, poiché fa ipotesi sul tuo ambiente in base a $SHELL
e i file di avvio (pensa) utilizzati dalla shell; non solo a volte indovina male, ma generalmente non puoi dirgli di comportarsi diversamente. (which
sul mio Ubuntu 10.10 non capisce --skip-alias
come menzionato da @SiegeX, per esempio.) type
usa l'ambiente della shell corrente invece di cercare i tuoi file di configurazione e può essere detto di ignorare parti di quell'ambiente, quindi ti mostra cosa accadrà effettivamente invece di cosa accadrebbe in una ricostruzione della tua shell predefinita.
In questo caso, type -P
ignorerà qualsiasi alias o funzione:
$ type -P vim
/usr/bin/vim
Puoi anche chiedergli di staccare tutto i livelli, uno alla volta, e mostrarti cosa troverebbe:
$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
(Espandendosi su questo dai commenti:)
Il problema con which
è che di solito è un programma esterno invece di un built-in della shell, il che significa che non può vedere i tuoi alias o funzioni e deve provare a ricostruirli dai file di avvio/config della shell. (Se è una shell integrata, come in zsh
ma apparentemente non bash
, è più probabile che utilizzi l'ambiente della shell e faccia la cosa giusta.)
type
è un comando conforme a POSIX che deve comportarsi come se fosse un built-in (ovvero, deve utilizzare l'ambiente della shell da cui viene invocato includendo alias e funzioni locali), quindi di solito è un built-in.
In genere non si trova in csh
/tcsh
, sebbene nella maggior parte delle versioni moderne di quelle which
è una shell incorporata e fa la cosa giusta; a volte il built-in è what
invece, e talvolta non c'è un buon modo per vedere l'ambiente della shell corrente da csh
/tcsh
affatto.