Was ist die Reihenfolge der Befehlsausgabe?

Was ist die Reihenfolge der Befehlsausgabe?

In Bash whichwerden 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 whichwie folgt definiert:

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

lssortiert den Dateinamen lexikalisch bei der Ausgabe und kommt danach , weil/usr/local/bin/git/usr/bin/gitlKommt danachbin Ihrer Region.

Die GNU-Implementierung lsverfügt über eine -UOption zum Deaktivieren dieser Sortierung.

Ihr /usr/bin/whichBefehl scheint einer zu sein, der den Pfad aller gefundenen Befehlsnamen ausgibt, $PATHwenn eine -aOption übergeben wird. Mit zshintegrierten 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 bashkein integriertes Element vorhanden ist which, sodass die whichdort ausgegebenen Elemente unabhängig von der Shell sind. Nur tcshund zshhaben whichintegrierte 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 $hashTabelle der ausführbaren Dateien ignoriert. Siehe auchWarum nicht „welches“ verwenden? Was soll man dann verwenden?

verwandte Informationen