Introduction to Trap Command and Cleaning Up

Welcome! In this lesson, we will explore the powerful trap command in Bash. The trap command executes a set of commands when a script exits, whether it completes successfully or encounters an error. This command is crucial for managing cleanup operations in your scripts. Proper cleanup ensures that temporary files and other resources do not clutter your system or cause unexpected behaviors.

Let's get started!

Understanding the trap Command

The trap command in Bash allows you to specify commands that should be executed when a certain signal is received by the script. Signals are notifications sent to a process to notify it of various events. For example, the EXIT signal is sent when the script exits, either normally or due to an error. The INT (interrupt) signal triggers when you press Ctrl+C to interrupt the script.

The general syntax for the trap command in Bash is as follows:

trap 'commands' signal

This line instructs the script to run commands when the specified signal is received. commands can be a string of commands, another script or a function.

The following script creates a file called temp.txt then exits. We use the trap command to remove this temporary file once the script exits.

solution.sh

#!/bin/bash

# Define a cleanup function
cleanup() {
  echo -e "ls command before cleanup... \n$(ls)\n"
  rm -f temp.txt
  echo -e "ls command after cleanup... \n$(ls)\n"
}

# Set up a trap to call the cleanup function on script exit
trap cleanup EXIT

# Creating a temporary file
touch temp.txt

# Simulate some work
echo "Working with temp.txt" 
echo "Done working with temp.txt. It can be cleaned up." 

# Exiting script
exit 0

In this script:

  • The cleanup function removes temporary files and prints ls output before and after rm -f temp.txt.
  • trap cleanup EXIT: Sets up a trap to call the cleanup function on script exit.
  • touch temp.txt: Creates an empty file named temp.txt.
  • Two echo statements simulate work with the temporary file.
  • When exit 0 is executed, the trap command ensures the cleanup function is called to remove the temporary file.

The output of the script is:

Working with temp.txt
Done working with temp.txt. It can be cleaned up.

ls command before cleanup... 
solution.sh
temp.txt

ls command after cleanup... 
solution.sh

The output of the script shows that when the exit 0 command is executed, the cleanup function is called, successfully removing the temp.txt. The trap command ensures that the cleanup function is executed regardless of how the script exits, providing a robust way to manage resources.

Handling Signals

The trap command can handle various signals, not just EXIT. For instance, the INT signal is sent when you press Ctrl+C to interrupt a script. Let’s modify our script to handle the INT signal as well. This script sets up two cleanup functions: one for handling the EXIT signal and another for the INT signal. When the script exits normally, the cleanup_exit function is invoked. If the user interrupts the script by pressing Ctrl+C, the cleanup_int function prints a message indicating that the script was interrupted. However, it does not remove the temporary file.

#!/bin/bash

# Define cleanup function for EXIT
cleanup_exit() {
   echo "EXIT signal received. Cleaning up..." 
   rm -f temp.txt
}

# Define cleanup function for INT
cleanup_int() {
   echo "INT signal received from Ctrl+C. Not removing temp.txt"
}

# Set traps
trap cleanup_exit EXIT
trap cleanup_int INT

# Simulate work
touch temp.txt
echo "Working with temp.txt. Press Ctrl+C to interrupt." 

# Exiting script
exit 0

In the script:

  • cleanup_exit defines a function that prints a descriptive message and removes temp.txt
  • cleanup_int defines a function that prints a descriptive message but does not remove temp.txt
  • trap cleanup_exit EXIT instructs the script to call cleanup_exit if the script receives an EXIT signal
  • trap cleanup_int INT instructs the script to call cleanup_int if the script receives an INT signal
  • exit 0 exits the script, sending an EXIT signal

If the script runs without the user pressing Ctrl+C, the output is:

Working with temp.txt. Press Ctrl+C to interrupt.
EXIT signal received. Cleaning up...

The temp.txt no longer exists in the current working directory.

If the user pressed Ctrl+C, the output is:

Working with temp.txt. Press Ctrl+C to interrupt.
INT signal received from Ctrl+C. Not removing temp.txt.

temp.txt will still exist in the current working directory.

Handling Exit Statuses
Summary and Next Steps

Great job! In this lesson, you learned how to:

  1. Define cleanup functions to manage resources.
  2. Use the trap command to execute cleanup functions on script exit.
  3. Handle various signals like EXIT and INT with specific cleanup commands.
  4. Manage multiple exit statuses using the trap command to ensure proper cleanup for successful and failed script executions.

Now it's time to put your new knowledge into practice! Head over to the practice section to try these concepts on your own. By practicing, you'll gain confidence and become adept at writing scripts that handle resources efficiently. Happy scripting!

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal