No bash vejo which
retornos dos caminhos em ordem, mas no zsh tem ordenação diferente.
Agora eu uso principalmente o zsh. Como posso obter a ordem de saída adequada which
no zsh? Por que é diferente? Eu esperava que a ordem correspondesse ao meu caminho.
Meu caminho é:/usr/local/bin:/usr/bin
bash$ which -a git
/usr/local/bin/git
/usr/bin/git
zsh$ which -a git
/usr/bin/git
/usr/local/bin/git -> ../Cellar/git/2.32.0/bin/git
Responder1
Acontece que você which
definiu como:
which(){
/usr/bin/which -a "$@" |
xargs ls -l |
tr -s ' ' |
cut -d ' ' -f 9-
}
ls
classifica o nome do arquivo lexicalmente na saída e vem depois porque/usr/local/bin/git
/usr/bin/git
l
vem depoisb
em sua localidade.
A implementação GNU ls
tem uma -U
opção para desabilitar essa classificação.
Seu /usr/bin/which
comando parece ser aquele que imprime o caminho de todos os nomes de comandos encontrados $PATH
quando uma -a
opção é passada. Com zsh
builtins, você pode fazer o mesmo com whence -pa
¹.
Então você poderia fazer algo como:
mywhich() (
set -o pipefail
zmodload zsh/stat
whence -pa "$@" |
while IFS= read -r f; do
if [[ -L $f ]] && stat -A l +link -- $f; then
print -r -- "$f -> $l"
else
print -r -- $f
fi
done
)
(aqui assumindo que nenhum dos caminhos de arquivo contém caracteres de nova linha).
Uma versão mais correta sua, em um sistema GNU, seria assim:
mywhich() (
set -o pipefail
command which -a "$@" |
xargs -rd '\n' ls -ndU -- |
sed -E 's/([^ ]+ +){8}//'
)
De qualquer forma, observe que bash
não possui um which
built-in, portanto, as which
saídas são independentes do shell. Somente tcsh
e zsh
tem which
embutido.
¹ porém, como o seu /usr/bin/which
(mas ao contrário do builtin do zsh which
), ele não informará necessariamente qual comando o shell executaria, pois ignora aliases, funções, componentes internos e até mesmo a $hash
tabela de executáveis. Veja tambémPor que não usar "qual"? O que usar então?