¿Cuál es el orden de salida de qué comando?

¿Cuál es el orden de salida de qué comando?

En bash veo whichque devuelve las rutas en orden, pero en zsh tiene un orden diferente.

Ahora uso principalmente zsh, ¿cómo puedo obtener el orden de salida adecuado whichen zsh? ¿Por qué es diferente? Esperaba que el orden coincidiera con mi camino.

Mi camino es:/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

Respuesta1

Sucedió que whichlo definiste como:

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

lsordena el nombre del archivo léxicamente en la salida y viene después porque/usr/local/bin/git/usr/bin/gitlviene despuésben tu localidad.

La implementación GNU de lstiene una -Uopción para deshabilitar esa clasificación.

Su /usr/bin/whichcomando parece ser uno que imprime la ruta de todos los nombres de comando que se encuentran $PATHcuando se pasa una -aopción. Con zshlas funciones integradas, puedes hacer lo mismo con whence -pa¹.

Entonces podrías hacer 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
)

(aquí suponiendo que ninguna de las rutas de archivo contiene caracteres de nueva línea).

Una versión tuya más correcta, en un sistema GNU, sería como:

mywhich() (
  set -o pipefail
  command which -a "$@" |
    xargs -rd '\n' ls -ndU -- |
    sed -E 's/([^ ]+ +){8}//'
)

En cualquier caso, tenga en cuenta que bashno tiene una whichfunción incorporada, por lo que las whichsalidas son independientes del shell. Solo tcshy zshtienen whichincorporado.


¹ sin embargo, como el suyo /usr/bin/which(pero al contrario del incorporado de zsh which), no necesariamente le dirá qué comando ejecutaría el shell, ya que ignora alias, funciones, complementos incorporados e incluso la $hashtabla de ejecutables. Ver también¿Por qué no utilizar "cuál"? ¿Qué usar entonces?

información relacionada