TRAP(1) General Commands Manual TRAP(1)

traptrap signals

trap [action condition ...]

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: , 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 9 SIGKILL 2 14 3 15 6 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.

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.

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 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: trapINT QUIT TERM EXIT

September 1991 posix.fail