zsh
is one of the few shells (the other ones being tcsh
(which
originated as a csh
script for csh
users, which also had its limitation, tcsh
made it a builtin as an improvement)) where which
does something sensible since it's a shell builtin, but somehow you or your OS (via some rc
file) broke it by replacing it with a call to the system which
command which can't do anything sensible reliably since it doesn't have access to the interns of the shell so can't know how that shell interprets a command name.
In zsh, all of which
, type
, whence
and where
are builtin commands that are all used to find out about what commands are, but with different outputs. They're all there for historical reason, you can get all of their behaviours with different flags to the whence
command.
You can get the details of what each does by running:
info -f zsh --index-search=which
Or type info zsh
, then bring up the index with i
, and enter the builtin name (completion is available).
And avoid using /usr/bin/which
. There's no shell nowadays where that which
is needed. As Timothy says, use the builtin that your shell provides for that. Most POSIX shells will have the type
command, and you can use command -v
to only get the path of a command (though both type
and command -v
are optional in POSIX (but not Unix, and not any longer in LSB), they are available in most if not all the Bourne-like shells you're likely to ever come across).
(BTW, it looks like /usr/bin
appears twice in your $PATH
, you could add a typeset -U path
to your ~/.zshrc
)
Best Answer
Yes, you do see the recommendation for
-U
often, usually paired with-z
. It’s not documented in therun-help
forautoload
, but there is a section titled “AUTOLOADING FUNCTIONS” in the manpage forzshmisc
.There it states:
I read that as “disregard aliases”. The
-z
seems to be to avoid Ksh-isms. I just memorize-Uz
and usually add them to any autoload. Maybe a worthwhile alias:alias al=’autoload -Uz’
.See also: https://stackoverflow.com/questions/12570749/zsh-completion-difference