Bash trap Command Explained

Introduction

A shell script can run into problems during its execution, resulting in an error signal that interrupts the script unexpectedly.

Errors occur due to a faulty script design, user actions, or system failures. A script that fails may leave behind temporary files that cause trouble when a user restarts the script.

This tutorial will show you how to use the trap command to ensure your scripts always exit predictably.

Bash trap command explained.

Prerequisites

  • Access to the terminal/command line.
  • A text editor (Nano, Vi/Vim, etc.).

Bash trap Syntax

The syntax for the trap command is:

trap [options] "[arguments]" [signals]

The command has the following components:

  • Options provide added functionality to the command.
  • Arguments are the commands trap executes upon detecting a signal. Unless the command is only one word, it should be enclosed with quotation marks (" "). If the argument contains more than one command, separate them with a semicolon (;).
  • Signals are asynchronous notifications sent by the system, usually indicating a user-generated or system-related interruption. Signals can be called by their name or number.

Bash trap Options

The trap command accepts the following options:

  • -p – Displays signal commands.
  • -l – Prints a list of all the signals and their numbers.

Below is the complete list of the 64 signals and their numbers:

#Signal#Signal#Signal
1SIGHUP23SIGURG45SIGRTMIN+11
2SIGINT24SIGXCPU46SIGRTMIN+12
3SIGQUIT25SIGXFSZ47SIGRTMIN+13
4SIGILL26SIGVTALRM48SIGRTMIN+14
5SIGTRAP27SIGPROF49SIGRTMIN+15
6SIGABRT28SIGWINCH50SIGRTMAX-14
7SIGBUS29SIGIO51SIGRTMAX-13
8SIGFPE30SIGPWR52SIGRTMAX-12
9SIGKILL31SIGSYS53SIGRTMAX-11
10SIGUSR132SIGWAITING54SIGRTMAX-10
11SIGSEGV33SIGLWP55SIGRTMAX-9
12SIGUSR234SIGRTMIN56SIGRTMAX-8
13SIGPIPE35SIGRTMIN+157SIGRTMAX-7
14SIGALRM36SIGRTMIN+258SIGRTMAX-6
15SIGTERM37SIGRTMIN+359SIGRTMAX-5
16SIGSTKFLT38SIGRTMIN+460SIGRTMAX-4
17SIGCHLD39SIGRTMIN+561SIGRTMAX-3
18SIGCONT40SIGRTMIN+662SIGRTMAX-2
19SIGSTOP41SIGRTMIN+763SIGRTMAX-1
20SIGTSTP42SIGRTMIN+864SIGRTMAX
21SIGTTIN43SIGRTMIN+9
22SIGTTOU44SIGRTMIN+10

Note: Signals 32 and 33 are not supported in Linux, and the trap -l command does not display them in the output.

The signals most commonly used with the trap command are:

  • SIGHUP (1) – Clean tidy-up
  • SIGINT (2) – Interrupt
  • SIGQUIT (3) – Quit
  • SIGABRT (6) – Cancel
  • SIGALRM (14) – Alarm clock
  • SIGTERM (15) – Terminate

Note: The SIG prefix in signal names is optional. For example, SIGTERM signal can also be written as TERM.

How to Use trap in Bash

A typical scenario for using the trap command is catching the SIGINT signal. This signal is sent by the system when the user interrupts the execution of the script by pressing Ctrl+C.

The following example script prints the word “Test” every second until the user interrupts it with Ctrl+C. The script then prints a message and quits.

trap "echo The script is terminated; exit" SIGINT

while true
do
    echo Test
    sleep 1
done

The while loop in the example above executes infinitely. The first line of the script contains the trap command and the instructions to wait for the SIGINT signal, then print the message and exit the script.

Executing the trap-test.sh script and terminating it with Ctrl+C.

The trap command is frequently used to clean up temporary files if the script exits due to interruption. The following example defines the cleanup function, which prints a message, removes all the files added to the $TRASH variable, and exits the script.

$TRASH=$(mktemp -t tmp.XXXXXXXXXX)

trap cleanup 1 2 3 6

cleanup()
{
  echo "Removing temporary files:"
  rm -rf "$TRASH"
  exit
}

...

The trap in the example above executes the cleanup function when it detects one of the four signals: SIGHUP, SIGINT, SIGQUIT, or SIGABRT. The signals are referred to by their number.

You can also use trap to ensure the user cannot interrupt the script execution. This feature is important when executing sensitive commands whose interruption may permanently damage the system. The syntax for disabling a signal is:

trap "" [signal]

Double quotation marks mean that no command will be executed. For example, to trap the SIGINT and SIGABRT signals, type:

trap "" SIGINT SIGABRT
[a command that must not be interrupted]

If you wish to re-enable the signals at any time during the script, reset the rules by using the dash symbol:

trap - SIGINT SIGABRT
[a command that can be interrupted]

Note: The SIGKILL signal cannot be trapped. It always immediately interrupts the script.

Conclusion

After reading this tutorial, you know how to use the trap command to ensure your bash script always exits properly. If you are interested in more Bash-related topics, read How to Run a Bash Script.

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/223463.html

(0)
上一篇 2022年1月6日
下一篇 2022年1月6日

相关推荐

发表回复

登录后才能评论