NAME
trap — trap
signals
SYNOPSIS
trap |
[action condition ...] |
DESCRIPTION
If action is −, the shell shall reset each condition to the
default value. If action is null (’’), the shell shall ignore
each of the specified conditions if they arise. Otherwise, the argument
action shall be read and executed by the shell when one of the corresponding
conditions arises. The action of the trap shall
override a previous action (either default action or one explicitly set).
The value of $? after the trap action completes
shall be the value it had before the trap was
invoked. The condition can be EXIT, 0 (equivalent to
EXIT ), or a signal specified using a symbolic name,
without the SIG prefix, as listed in Required Signals and
Job Control Signals (Table 3-1 and Table 3-2 in POSIX. 1
{8}). (For example:
HUP,
INT, QUIT, TERM ).
Setting a trap for SIGKILL or
SIGSTOP produces undefined results. The environment in
which the shell executes a trap on
EXIT shall be identical to the environment immediately
after the last command executed before the trap on
EXIT was taken. Each time the trap
is invoked, the action argument shall be processed in a manner equivalent
to: eval "$action"
Signals that were ignored on entry to a noninteractive shell
cannot be trapped or reset, although no error need be reported when
attempting to do so. An interactive shell may reset or catch signals ignored
on entry. Traps shall remain in place for a given shell until explicitly
changed with another trap command. The
trap command with no arguments shall write to
standard output a list of commands associated with each condition. The
format is: " trap -- %s %s . . . \n",
<action>, <condition> . . .
The shell shall format the output, including the proper use of quoting, so that it is suitable for re-input to the shell as commands that achieve the same trapping results. An implementation may allow numeric signal numbers for the conditions as an extension, if and only if the following map of signal numbers to names is true: Signal Signal Signal Signal Number Name Number
Name 1
SIGHUP 9
SIGKILL 2
SIGINT
14
SIGALRM
3
SIGQUIT
15
SIGTERM
6
SIGABRT
Otherwise, it shall be an error for the application to use numeric signal
numbers. The trap special built-in shall conform to
the utility argument syntax guidelines described in 2.10.2.
EXIT STATUS
If the trap name or number is invalid, a
nonzero exit status shall be returned; otherwise, zero shall be returned.
For both interactive and noninteractive shells, invalid signal names or
numbers shall not be considered a syntax error and shall not cause the shell
to abort.
RATIONALE
Implementations may permit lowercase signal names as an extension.
Implementations may also accept the names with the SIG
prefix; no known historical shell does so. The trap
and kill utilities in POSIX. 2 are now consistent in their
omission of the SIG prefix for signal names. Some kill
implementations do not allow the prefix and kill −l lists the signals
without prefixes.
As stated previously, when a subshell is entered, traps are set to
the default actions. This does not imply that the
trap command cannot be used within the subshell to
set new traps.
Trapping SIGKILL or SIGSTOP is accepted by some historical implementations, but it does not work. Portable POSIX. 2 applications cannot try it. The output format is not historical practice. Since the output of historical traps is not portable (because numeric signal values are not portable) and had to
3.14 Special Built-in Utilities 259
change to become so, an opportunity was taken to format
the output in a way that a shell script could use to save and then later
reuse a trap if it wanted. For example:
save_traps=$( trap ) ... eval
"$save_traps" The KornShell uses an
ERR
trap that is triggered whenever set −e would
cause an exit. This is allowable as an extension, but was not mandated, as
other shells have not used it. The text about the environment for the
EXIT trap invalidates the behavior
of some historical versions of interactive shells which, e.g., close the
standard input before executing a trap on 0. For
example, in some historical interactive shell sessions the following
trap on 0 would always print - -:
trap ’read foo; echo
"-$foo-"’ 0 Examples: Write out a list of all traps and
actions: trap Set a trap so
the logout utility in the HOME directory will execute when
the shell terminates: trap ’$
HOME /logout’ EXIT or
trap ’$ HOME
/logout’ 0 Unset traps on INT,
QUIT, TERM, and EXIT:
trap − INT
QUIT TERM EXIT