Builtin and non builtin command execution



Builtin and non-builtin command execution


Up
Next
Previous
Builtin and non-builtin command execution
Builtin commands are executed within the shell. If any component of a
pipeline except the last is a builtin command, the pipeline is executed
in a subshell.

Parenthesized commands are always executed in a subshell.


(cd; pwd); pwd


thus prints the home directory, leaving you where you were
(printing this after the home directory), while


cd; pwd


leaves you in the home directory. Parenthesized commands are most often
used to prevent cd from affecting the current shell.

When a command to be executed is found not to be a builtin command the shell
attempts to execute the command via execve(2). Each word in the variable
path names a directory in which the shell will look for the
command. If it is given neither a -c nor a -t option, the shell
hashes the names in these directories into an internal table so that it will
only try an execve(2) in a directory if there is a possibility that the
command resides there. This greatly speeds command location when a large
number of directories are present in the search path. If this mechanism has
been turned off (via unhash), if the shell was given a -c or
-t argument or in any case for each directory component of path
which does not begin with a `/', the shell concatenates the current working
directory with the given command name to form a path name of a file which it
then attempts to execute.

If the file has execute permissions but is not an executable to the system
(i.e. it is neither an executable binary nor a script which specifies its
interpreter), then it is assumed to be a file containing shell commands and
a new shell is spawned to read it. The shell special alias may be set
to specify an interpreter other than the shell itself.

On systems which do not understand the `#!' script interpreter convention
the shell may be compiled to emulate it; see the version shell
variable. If so, the shell checks the first line of the file to
see if it is of the form `#!interpreter arg ...'. If it is,
the shell starts interpreter with the given args and feeds the
file to it on standard input.

Up
Next
Previous



Wyszukiwarka