Como a maioria dos usuários, tenho vários aliases configurados para fornecer um conjunto padrão de sinalizadores para programas usados com freqüência. Por exemplo,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
O problema é que, se eu quiser usar which
para ver de onde vem meu vim
/ grep
/ ls
/ etc, o alias fica no caminho:
$ which vim
vim: aliased to vim -X
Esta é uma saída útil, mas não é o que estou procurando neste caso; Eu sei que vim
é um alias, vim -X
mas quero saber de onde isso vim
vem.
Exceto temporariamente a não definição do alias, apenas para que eu possa usá which
-lo, existe uma maneira fácil de which
'desembrulhar' o alias e executar isso sozinho?
Edit: Parece que which
é um shell-builtin com comportamentos diferentes em diferentes conchas. No Bash, a sugestão da --skip-alias
bandeira do SiegeX funciona; no entanto, estou no Zsh. Existe algo semelhante lá?
vim
vem , você usaria #where vim
Respostas:
which
é realmente uma maneira ruim de fazer coisas assim, pois faz suposições sobre o seu ambiente com base nos$SHELL
arquivos de inicialização (que ele acha) que o shell usa; às vezes, não apenas parece errado, mas você geralmente não pode dizer para se comportar de maneira diferente. (which
no meu Ubuntu 10.10 não entende--skip-alias
como mencionado por @SiegeX, por exemplo.)type
usa o ambiente de shell atual em vez de cutucar seus arquivos de configuração e pode ser instruído a ignorar partes desse ambiente, mostrando o que realmente acontecer em vez do que aconteceria em uma reconstrução do seu shell padrão.Nesse caso,
type -P
ignorará quaisquer aliases ou funções:Você também pode pedir para remover todas as camadas, uma de cada vez, e mostrar o que seria encontrado:
(Expandindo isso a partir dos comentários :)
O problema
which
é que geralmente é um programa externo em vez de um shell embutido, o que significa que ele não pode ver seus apelidos ou funções e precisa reconstruí-los a partir dos arquivos de inicialização / configuração do shell. (Se é um shell embutido, como está,zsh
mas aparentemente nãobash
é, é mais provável que você use o ambiente do shell e faça a coisa certa.)type
é um comando compatível com POSIX que deve se comportar como se fosse um built-in (ou seja, ele deve usar o ambiente do shell para o qual é invocado, incluindo aliases e funções locais); portanto, geralmente é um built-in.Geralmente não é encontrado em
csh
/tcsh
, embora na maioria das versões modernaswhich
seja um shell embutido e faça a coisa certa; às vezes o built-in éwhat
, e às vezes não há uma boa maneira de ver o ambiente atual do shell decsh
/tcsh
para.fonte
type -a
parece retornar todas as instâncias no seu$PATH
, não apenas a primeira. Acho que vou apelidowhich
paratype
:)type
faz parte do padrão POSIX, esse é o caminho a seguir. Para responder minha pergunta, digite também funciona no zsh (no Debian). Por que as distribuições não se livramwhat
ewhich
se não são padronizadas e não têm funcionalidade extra?info bash 'Bash builtins'
no Linux, embora você também possa obtê-lo nozsh
manual de referência. Mais oficialmente, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (o que eu noto que na verdade não especifica-P
ou-a
, ou mesmo-p
qual era a forma original-P
, mas exige que ele use o ambiente de shell atual).type -p
se comporta de maneira diferente entre zsh e bash.type -P
não existe no zsh.Em
bash
:Em
zsh
:Em ambos:
Ou:
fonte
No zsh
which
é um builtin como este comando relata:Para executar o comando externo (em qualquer shell)
which
, use o Caminho completo :portanto, o comando
ls
foi encontrado (um valor de saída 0) e está localizado em/bin/ls
.Dentro
zsh
; Uma maneira (ao lado da acima) de procurar comandos externos é:No entanto, isso não resolverá aliases aninhados como:
O comando relatará que nenhum
dire
comando foi encontrado.Para resolver aliases aninhados (manualmente), consulte
Resolve nested aliases to their source commands
fonte
Mina definida como tal
fonte
Tente o seguinte:
fonte
which
na verdade, é um shell embutido e não um utilitário Unix comum, como eu havia assumido. Então, eu devo editar minha pergunta e especificar Zsh. Obrigado por apontar isso para mim!which
não é embutido, pelo menos não no Debian. É um script de shell e parte do debianutils, então funciona no zsh. No entanto,--skip-alias
não é uma opçãowhich
no Debian. Existem diferentes variedades dewhich
flutuação? Isso não parece ser um comando padronizado.man zshbuiltins
. cujo nome [-wpams] ... Equivale a de onde -c.bash
, ele não é um built-in e não tem a--skip-alias
opção./usr/bin/which
mais um alias/etc/profile.d
que permite lidar com aliases, mas--skip-alias
funciona. Como resultado,which which
mostra o alias, mascommand which which
mostra o executável!Outra alternativa é
command which vim
, que funciona da mesma maneira em amboszsh
ebash
Por exemplo, no meu mac:
fonte
Ambos
type
ewhich
se comportam de maneira diferente de acordo com o seu tipo de shell.No bash,
which
existe um comando noPATH
. Ele pesquisa o comando que você fornecePATH
. O Bash builtintype -P
(P paraPATH
) se comporta exatamente comowhich
.No ZSH, ambos são
which
etype
são funções integradas e parciaiswhence
.which -p
é o que você quer. Força uma pesquisa de caminho. (a-P
opção não está disponível paratype
ZSH.)Mais do manual ZSH.
Para pular
builtin
which
e forçar comando usowhich
dePATH
em ZSH:fonte