Command Execution
When you type a command to Bash or ksh93, they look in the following places until they find a match:
Keywords such as
if
andfor
.Aliases. You can’t define an alias whose name is a shell keyword, but you can define an alias that expands to a keyword, e.g.,
alias aslongas=while
. (Bash, when not in POSIX mode, does allow you to define an alias for a shell keyword.)Special built-ins like break and continue. The list of POSIX special built-ins is . (dot), :, break, continue, eval, exec, exit, export, readonly, return, set, shift, times, trap, and unset. The Korn shell adds alias, login, typeset, and unalias, while Bash adds source.
Functions. When not in POSIX mode, Bash finds functions before built-in commands.
Nonspecial built-ins like cd and test.
Scripts and executable programs, for which the shell searches in the directories listed in the PATH environment variable.
The distinction between “special” built-in commands and nonspecial ones comes from POSIX. This distinction, combined with the command command, makes it possible to write functions that override shell built-ins, such as cd. For example:
cd () { Shell function; found before built-in cd command cd "$@" Use real cd to change directory echo now in $PWD Other stuff we want to do }
In ksh88, the search order is different, all built-ins are found before shell functions. Thus you have to do more work to override a built-in command with a function. You do so using a combination of functions and aliases:
_cd () { Shell function; note leading underscore cd "$@" Use real cd to change directory echo now in $PWD Other stuff we want to do } alias cd=_cdAlias found first
Get Unix in a Nutshell, 4th Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.