Built-in commands are always preferred to external commands. The rationale is that the built-in command is faster (and in a few cases, such as cd
or test -o BASH_OPTION
, only the built-in command can have the desired effect).
Sometimes the external command may have capabilities that the shell builtin doesn't. In that case, you can call the external command by giving an explicit path (i.e. containing a slash) (this bypasses any concern about the order in $PATH
). If you don't want to hard-code the external path but you do want to prevent the use of the builtin, you can use "$(type -P test)"
(note capital P
) in bash, "$(whence -p test)"
in ksh, and =test
in zsh.
Another way to force the use of an external command is to go through the env
utility (env test …
).
In zsh, you can disable a builtin with disable test
. This is permanent (for the current shell or subshell) until the builtin is reenabled with enable test
. In bash, you can do the same with enable -n test
to disable and enable test
to reenable.
You can use an alias or function to force the execution of a different command, for example alias test=/usr/bin/test
or test () { /usr/bin/test "$@"; }
. If you have such an alias, you can prevent its use by quoting any part of it, e.g. \test
will perform the normal function/builtin/external lookup. Note that depending on the shell and its settings, alias definitions in a function may be expanded when a function is read or when it is executed. If you've defined a function, you can use command test
to prevent function lookup as well as alias lookup (so here the test
builtin will be invoked unless disabled).
/usr/bin/test -f "$file"
... – jasonwryan May 29 '14 at 22:43