
En bash veo which
que 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 which
en 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 which
lo definiste como:
which(){
/usr/bin/which -a "$@" |
xargs ls -l |
tr -s ' ' |
cut -d ' ' -f 9-
}
ls
ordena el nombre del archivo léxicamente en la salida y viene después porque/usr/local/bin/git
/usr/bin/git
l
viene despuésb
en tu localidad.
La implementación GNU de ls
tiene una -U
opción para deshabilitar esa clasificación.
Su /usr/bin/which
comando parece ser uno que imprime la ruta de todos los nombres de comando que se encuentran $PATH
cuando se pasa una -a
opción. Con zsh
las 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 bash
no tiene una which
función incorporada, por lo que las which
salidas son independientes del shell. Solo tcsh
y zsh
tienen which
incorporado.
¹ 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 $hash
tabla de ejecutables. Ver también¿Por qué no utilizar "cuál"? ¿Qué usar entonces?