Intro¶
A built-in is a command provided by the shell itself, not a program stored somewhere in the path.
Bash’s man page uses the spelling bultin. Zsh man page seems to use a mix of built-in and builtin. The POSIX spec for the Shell Command Language seems to strictly use built-in. Let’s attempt to consistently use POSIX spelling (built-in) throughout this website.
POSIX builtin reserved word¶
The POSIX spec does not define a built-in command called builtin
, but makes it a “reserved word”. Note, especially, this line:
“If the command name matches the name of a utility listed in the following table, the results are unspecified.”

Shells implementation of builtin¶
Shells have implemented that utility called builtin
(builtin here is the actual name of the command) for their (the shell’s) specific purposes. For example, in Bash:
$ help builtin
builtin: builtin [shell-builtin [arg ...]]
Execute shell builtins.
Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup. This is useful when you wish to re-implement a shell builtin
as a shell function, but need to execute the builtin within the function.
Exit Status:
Returns the exit status of SHELL-BUILTIN, or false if SHELL-BUILTIN is
not a shell builtin.
One such use case is with cd
. We may find it useful to have a function cd
than when executed first does some other thing, like checking for the existence and reading an .env
file in the cd
ed directory, and then actually invoking the builtin cd
to that directory. Something like:
##
# Read .env.txt (if it exists) when changing to a directory.
#
cd () {
builtin cd "$@"
if [[ -f ./.env.txt ]]
then
cat .env.txt
fi
}
We could use this approach to read .nvmrc
or any other project related setup file for whatever language, library or framework it makes sense.