Acho que a maioria está familiarizada com o which
comando e o uso com frequência. Acabei de encontrar uma situação em que estou curioso, não apenas qual comando é o primeiro no meu caminho, mas quantos e onde estão todos os comandos em todos os meus caminhos. Tentei a página de manual (digitar man which
me fez rir), mas não vi nada.
19
which --all
.which -a
.Respostas:
Em alguns sistemas,
which -a
mostra todas as correspondências. Se o seu shell for bash ou zsh¹, você poderá usartype
:type foo
mostra a primeira correspondência etype -a foo
mostra todas as correspondências. Os três comandostype
,which
ewhence
fazer principalmente a mesma coisa; eles diferem entre shells e sistemas operacionais em disponibilidade, opções e o que exatamente eles relatam.type
está sempre disponível e mostra todos os nomes possíveis de comandos (aliases, palavras-chave, built-ins do shell, funções e comandos externos).A única maneira totalmente portátil de exibir todas as correspondências é analisar a
$PATH
si mesmo. Aqui está um script de shell que faz isso. Se você transformá-la em uma função shell, coloque o corpo da função entre parênteses (para que a mudança paraIFS
eset -f
não escape da função) e mudeexit
parareturn
.¹ Ou ksh 93, de acordo com a documentação, embora o ksh 93s + 2008-01-31 só imprima a primeira correspondência quando eu tento.
fonte
sh
código não funciona corretamente se houver componentes vazios$PATH
. Observe também que$IFS
é um delimitador de campo (pelo menos em shells POSIX) enquanto em$PATH
, dois pontos é usado como um separador de campos . Veja owhich
script encontrado no Debian para uma implementação correta.type
built-inksh93u+ 2012-08-01
parece funcionar corretamente.O sinalizador --all ou -a mostrará todas as correspondências no seu caminho e aliases (pelo menos no Fedora, Ubuntu e CentOS):
No AIX e Solaris, você chegará perto:
fonte
$PATH
contiver caracteres em branco ou shell globbing.read -r
é necessário lidar com barras invertidas. Esse não é um bom método, poisfind
levará muito tempo e poderá retornar correspondências falsas se um diretório$PATH
contiver subdiretórios. Felizmente,find
não é útil aqui; veja minha resposta.Se você não tem um
which
suporte-a
ou estáwhence
disponível, faça o seu:fonte
set -f
desligar os olhos desprotegidos$PATH
.test -f
não é suficiente, pois somente arquivos executáveis são desejados aqui; você precisatest -x
. Hmm, percebo que esqueci o teste de arquivo regular no meu script.whence README.txt
tão improvável quantowhence "file* wi?h we!rd name"
. Apenas tentando mostrar como é fácil atravessar$PATH
.O ksh e o zsh têm "donde" como um shell embutido.
whence -a
faz o que você quer no zsh:Eu tenho que limpar o PATH no zsh, tenho muitas duplicatas nele.
whence -a
funciona de maneira diferente no ksh:Devo dizer que também parece um comportamento potencialmente útil.
fonte