Skip to content

Instantly share code, notes, and snippets.

@undying
Last active March 28, 2025 08:40
Show Gist options
  • Save undying/98a24351d41b6bbeca6d92bf1e22dd69 to your computer and use it in GitHub Desktop.
Save undying/98a24351d41b6bbeca6d92bf1e22dd69 to your computer and use it in GitHub Desktop.
Function wrapper for trap in Bash. It works almost like "defer" in Golang, allowing you to append multiple functions that will be called on a specific event.
function set_trap(){
local function_name="${1}"
local signal_name="${2}"
local current_trap
local current_code
[[ -z "${function_name}" || -z "${signal_name}" ]] && return 1
current_trap=$(trap -p "${signal_name}")
if [[ -z "${current_trap}" ]];then
eval "trap '${function_name}' ${signal_name}"
return 0
fi
current_code=$(echo "${current_trap}" \
|sed -E "s/trap -- (['\"]?)(.+)\1 ${signal_name}/\2/")
eval "trap -- '${function_name};${current_code}' ${signal_name}"
return 0
}
@undying
Copy link
Author

undying commented Mar 28, 2025

Usage example:

RULES_GET_DST="$(mktemp)"
set_trap "rm -f ${RULES_GET_DST}" EXIT

TMP_FILE="$(mktemp)"
set_trap "rm -f ${TMP_FILE}" EXIT

You can stack code that will be executed on a certain signal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment