Qual é a ordem de saída de qual comando?

Qual é a ordem de saída de qual comando?

No bash vejo whichretornos 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 whichno 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ê whichdefiniu como:

which(){
  /usr/bin/which -a "$@" |
    xargs ls -l |
    tr -s ' ' |
    cut -d ' ' -f 9-
}

lsclassifica o nome do arquivo lexicalmente na saída e vem depois porque/usr/local/bin/git/usr/bin/gitlvem depoisbem sua localidade.

A implementação GNU lstem uma -Uopção para desabilitar essa classificação.

Seu /usr/bin/whichcomando parece ser aquele que imprime o caminho de todos os nomes de comandos encontrados $PATHquando uma -aopção é passada. Com zshbuiltins, 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 bashnão possui um whichbuilt-in, portanto, as whichsaídas são independentes do shell. Somente tcshe zshtem whichembutido.


¹ 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 $hashtabela de executáveis. Veja tambémPor que não usar "qual"? O que usar então?

informação relacionada