.. historic nodename: Command Execution

Command Execution
================================================================================

.. only:: man

    Command Execution
    --------------------------------------------------------------------------------
    

.. index:: single: command execution; Command

.. index:: single: execution, of commands; Command

.. index:: single: command not found, handling of; Command

.. index:: single: command_not_found_handler; Function

If a command name contains no slashes, the shell attempts to locate
it.  If there exists a shell function by that name, the function
is invoked as described in :zshsectref:`Functions <below>`.  If there exists
a shell builtin by that name, the builtin is invoked.

.. index:: single: path, use of; Variable

Otherwise, the shell searches each element of ``$path`` for a
directory containing an executable file by that name.

If execution fails: an error message is printed, and one of the
following values is returned.

127
    The search was unsuccessful.  The error message is
    ``command not found:`` :var:`cmd`.

126
    The executable file has insufficient permissions, is a
    directory or special file, or is not a script and is in a format
    unrecognized by the operating system.  The exact conditions and error
    message are operating system-dependent; see
    :manpage:`execve(2)`.

If execution fails because the file is not in executable format,
and the file is not a directory, it is assumed to be a shell
script.  ``/bin/sh`` is spawned to execute it.  If the program
is a file beginning with ``#!``, the remainder of the first line
specifies an interpreter for the program.  The shell will
execute the specified interpreter on operating systems that do
not handle this executable format in the kernel.

If no external command is found but a function ``command_not_found_handler``
exists the shell executes this function with all
command line arguments.  The return status of the function becomes the
status of the command.  Note that the handler is executed in a
subshell forked to execute an external command, hence changes to
directories, shell parameters, etc. have no effect on the main shell.
