
In Bash which
werden die Pfade meiner Ansicht nach in der richtigen Reihenfolge zurückgegeben, in Zsh ist die Reihenfolge jedoch anders.
Ich verwende jetzt hauptsächlich zsh. Wie kann ich in zsh die richtige Ausgabereihenfolge erreichen which
? Warum ist sie anders? Ich habe erwartet, dass die Reihenfolge mit meinem Pfad übereinstimmt.
Mein Weg ist:/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
Antwort1
Sie haben es zufällig which
wie folgt definiert:
which(){
/usr/bin/which -a "$@" |
xargs ls -l |
tr -s ' ' |
cut -d ' ' -f 9-
}
ls
sortiert den Dateinamen lexikalisch bei der Ausgabe und kommt danach , weil/usr/local/bin/git
/usr/bin/git
l
Kommt danachb
in Ihrer Region.
Die GNU-Implementierung ls
verfügt über eine -U
Option zum Deaktivieren dieser Sortierung.
Ihr /usr/bin/which
Befehl scheint einer zu sein, der den Pfad aller gefundenen Befehlsnamen ausgibt, $PATH
wenn eine -a
Option übergeben wird. Mit zsh
integrierten Befehlen können Sie dasselbe mit whence -pa
¹ tun.
Sie könnten also etwa Folgendes tun:
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
)
(hier wird vorausgesetzt, dass keiner der Dateipfade Zeilenumbruchzeichen enthält).
Eine korrektere Version von Ihnen auf einem GNU-System würde wie folgt aussehen:
mywhich() (
set -o pipefail
command which -a "$@" |
xargs -rd '\n' ls -ndU -- |
sed -E 's/([^ ]+ +){8}//'
)
Beachten Sie in jedem Fall, dass bash
kein integriertes Element vorhanden ist which
, sodass die which
dort ausgegebenen Elemente unabhängig von der Shell sind. Nur tcsh
und zsh
haben which
integrierte Elemente.
¹ Allerdings wird es Ihnen, wie bei Ihnen /usr/bin/which
(aber im Gegensatz zu zshs eingebautem which
), nicht unbedingt sagen, welchen Befehl die Shell ausführen würde, da es Aliase, Funktionen, eingebaute Funktionen und sogar die $hash
Tabelle der ausführbaren Dateien ignoriert. Siehe auchWarum nicht „welches“ verwenden? Was soll man dann verwenden?