Was ist der Unterschied zwischen welchem ​​und wo

16

Was ist der Unterschied zwischen whereund whichShell-Befehlen? Hier sind einige Beispiele

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

und

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

ebenfalls

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

Mir scheint, dass sie dasselbe tun wie eine eingebaute Shell, nicht ganz sicher, wie sich das von einem Befehl unterscheidet?

nikhil
quelle

Antworten:

11

zshist eine der wenigen Shells (die anderen sind tcsh( whichursprünglich als cshSkript für cshBenutzer tcshgedacht , was ebenfalls eine Einschränkung darstellte )), in denen whichetwas Sinnvolles getan wird, da es eine eingebaute Shell ist, aber irgendwie Sie oder Ihr Betriebssystem (über eine rcDatei) hat es durch einen Aufruf des Systembefehls ersetzt, whichder nichts Sinnvolles zuverlässig tun kann, da er keinen Zugriff auf die Interns der Shell hat und daher nicht weiß, wie diese Shell einen Befehlsnamen interpretiert .

In zsh, alle which, type, whenceund wheresind builtin Befehle , die alle verwendet , um herauszufinden , über das , was Befehle, aber mit unterschiedlichen Ausgängen. Sie sind alle aus historischen Gründen da, Sie können alle ihre Verhaltensweisen mit verschiedenen Flags auf den whenceBefehl bekommen.

Sie können die Details der einzelnen Aktionen abrufen, indem Sie Folgendes ausführen:

info -f zsh --index-search=which

Oder geben Sie ein info zsh, irufen Sie den Index mit auf und geben Sie den eingebauten Namen ein (die Vervollständigung ist verfügbar).

Und vermeiden Sie die Verwendung /usr/bin/which. Es gibt heutzutage keine Shell, in der das which benötigt wird. Verwenden Sie, wie Timothy sagt, das eingebaute Element, das Ihre Shell dafür bereitstellt. Die meisten POSIX-Shells haben den typeBefehl, und Sie können command -vnur den Pfad eines Befehls abrufen (obwohl beide typeund command -vin POSIX optional sind (aber nicht Unix und nicht mehr in LSB), sind sie in den meisten, wenn nicht allen, verfügbar Bourne-ähnliche Muscheln, auf die Sie wahrscheinlich jemals stoßen werden).

(Übrigens, es sieht aus wie /usr/binerscheint zweimal in Ihrem $PATH, können Sie eine hinzufügen , typeset -U pathum Ihre ~/.zshrc)

Stéphane Chazelas
quelle
2
Dies ist auch in einer früheren Frage angesprochen worden. Um diesen Punkt zu erweitern, sollten Sie immer einen eingebauten Shell-Befehl verwenden, sofern einer vorhanden ist. Verwenden Sie in bash "type" anstelle von "which".
Tim B
Ausgezeichnete Antwort und danke auch für diesen Tipp.
Nikhil