Come usare `quale` su un comando con alias?


76

Come la maggior parte degli utenti, ho un gruppo di alias impostato per fornire un set predefinito di flag per i programmi utilizzati di frequente. Per esempio,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

Il problema è che se voglio usare whichper vedere da dove proviene il mio vim/ grep/ ls/ etc, l'alias si mette in mezzo:

$ which vim
vim: aliased to vim -X

Questo è un output utile, ma non quello che sto cercando in questo caso; So che vimè alias per vim -Xma io voglio sapere dove che vim proviene.

A meno di non definire temporaneamente l'alias solo per consentirci di utilizzarlo which, esiste un modo semplice per which"scartare" l'alias ed eseguirlo?

Modifica: sembra che whichsia una shell-builtin con comportamenti diversi su shell diverse. In Bash, il suggerimento di SiegeX sulla --skip-aliasbandiera funziona; comunque, sono su Zsh. Esiste qualcosa di simile lì?


in zsh, se vuoi sapere da dove vimviene , where vim
useresti

Risposte:


105

whichè in realtà un brutto modo di fare cose del genere, in quanto $SHELLipotizza il tuo ambiente in base ai file di avvio (pensa) che utilizza la shell; a volte non solo indovina, ma in genere non si può dire che si comporti diversamente. ( whichsul mio Ubuntu 10.10 non capisce --skip-aliascome menzionato da @SiegeX, ad esempio.) typeutilizza l'ambiente shell corrente invece di cercare i file di configurazione, e può essere detto di ignorare parti di quell'ambiente, quindi ti mostra cosa sarà effettivamente accade invece di ciò che accadrebbe in una ricostruzione della shell predefinita.

In questo caso, type -Pignorerà tutti gli alias o le funzioni:

$ type -P vim
/usr/bin/vim

Puoi anche chiedergli di staccare tutti i livelli, uno alla volta, e mostrarti cosa troverebbe:

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim

(Espandendo su questo dai commenti :)

Il problema whichè che di solito è un programma esterno invece di una shell integrata, il che significa che non può vedere i tuoi alias o funzioni e deve provare a ricostruirli dai file di avvio / configurazione della shell. (Se si tratta di una shell integrata, così come è zshma a quanto pare no bash, è più probabile che usi l'ambiente della shell e faccia la cosa giusta.)

typeè un comando conforme a POSIX che deve comportarsi come se fosse un built-in (cioè deve usare l'ambiente della shell da cui è invocato includendo alias e funzioni locali), quindi di solito è un built-in.

Non si trova generalmente in csh/ tcsh, anche se nella maggior parte delle versioni moderne di questi whichè un shell incorporato e fa la cosa giusta; a volte whatinvece è integrato , ea volte non c'è un buon modo per vedere l'ambiente della shell corrente da csh/ tcshper niente.


6
Grazie! Questo è qualcosa di molto utile da aggiungere alla mia borsa di trucchi. Mi piace in particolare che type -asembra restituire tutte le istanze sul tuo $PATH, non solo il primo. Penso che alias whicha type:)
Adrian Petrescu

2
@ geekosaur: grazie. Se typefa parte dello standard POSIX, questa è la strada da percorrere. Per rispondere alla mia domanda, digita funziona anche su zsh (su Debian). Perché le distribuzioni non vengono eliminate whate whichse non sono standardizzate e non dispongono di funzionalità extra?
Faheem Mitha,

1
No, nemmeno da remoto.
geekosaur,

1
@Faheem: per quanto riguarda la documentazione, vorrei iniziare con info bash 'Bash builtins'Linux, anche se puoi ottenerlo anche dal zshmanuale di riferimento. Più ufficialmente, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (che noto in realtà non specifica -Po -a, o -pche era la forma originale di -P, ma richiede che utilizzi l'attuale ambiente shell).
geekosaur,

2
type -psi comporta diversamente tra zsh e bash. type -Pnon esiste affatto in zsh.
Kojiro,

15

In bash:

type -P vim

In zsh:

type -p vim

In entrambe:

/usr/bin/which vim

O:

( unalias vim; type vim )

2
L'ultimo è bello. Possiamo avere un alias per farlo. :)
balki,

In bash su redhat devo usare il tipo -P, e non quale, se voglio la risposta corretta. Non sono interessati alias o funzioni.

Dr Eval, quale "quale"? Quale cappello rosso?
Mikel,

@Mikel RH7.4. GNU quale v2.20.

4

In zsh whichè incorporato come questo comando riporta:

$ whence -w which
which: builtin

Per eseguire il comando esterno (in qualsiasi shell) which, utilizzare il percorso completo :

$ /bin/which ls; echo $?
/bin/ls
0

quindi il comando è lsstato trovato (un valore di uscita pari a 0) e si trova in /bin/ls.

Dentro zsh; un modo (oltre a quello sopra) per cercare comandi esterni è:

$ whence -p ls
/bin/ls

Tuttavia, ciò non risolverà gli alias nidificati come:

$ alias dire='ls -l'

Il comando segnalerà che non è direstato trovato alcun comando.

$ whence -p dire; echo $?
1

Per la risoluzione degli alias nidificati (manualmente) vedere Resolve nested aliases to their source commands


2

Il mio definito come tale

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

1

Prova quanto segue:

which --skip-alias vim

1
Interessante! Funziona su Bash, ma non su Zsh (non pensavo davvero che sarebbe stato dipendente dalla shell). Questo mi ha fatto capire che in whichrealtà è una shell integrata e non una normale utility Unix come avevo immaginato. Quindi dovrei modificare la mia domanda e specificare Zsh. Grazie per avermelo segnalato!
Adrian Petrescu,

whichnon è incorporato, almeno non su Debian. È uno script di shell e parte di debianutils, quindi funziona su zsh. Tuttavia, --skip-aliasnon è un'opzione whichsu Debian. Ci sono diverse varietà di whichgalleggianti in giro? Questo non sembra essere un comando standardizzato.
Faheem Mitha,

@Faheem Mitha: è un built-in zsh. Vedere man zshbuiltins. quale [-wpams] nome ... Equivalente a da dove -c.
Mikel,

Sì, su Xubuntu bash, non è integrato e non ha l' --skip-aliasopzione.
polimero

Su CentOS (e RHEL?) 6, è un eseguibile /usr/bin/whichpiù un alias /etc/profile.dche gli consente di gestire gli alias ma --skip-aliasfunziona. Di conseguenza which whichmostra l'alias, ma command which whichmostra l'eseguibile!
dave_thompson_085,

0

Un'altra alternativa è command which vimche funziona allo stesso modo in entrambe zshebash

Ad esempio sul mio mac:

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep

Ah abbastanza giusto.
Zee Alexander,

0

Entrambi typee si whichcomportano diversamente in base al tipo di shell.

In bash, whichesiste un comando in PATH. Cerca il comando fornito PATH. Bash builtin type -P(P for PATH) si comporta esattamente come which.

In ZSH, entrambi whiche typesono builtin e funzioni parziali di builtin whence. which -pè quello che vuoi. Forza una ricerca del percorso. (l' -Popzione non è disponibile per typeZSH.)

da cui [-vcwfpamsS] [-x num] nome ...

-p

Esegui una ricerca del percorso per nome anche se si tratta di un alias, una parola riservata, una funzione shell o un built-in.

Altro dal manuale ZSH.

quale [-wpamsS] [-x num] nome ...

Equivalente a da dove -c.

Per saltare builtin whiche forzare usare il comando whichda PATHin ZSH:

alias which="command which"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.