diff --git a/content/blog/bash-traps-exit-error-sigint.md b/content/blog/bash-traps-exit-error-sigint.md new file mode 100644 index 0000000..9daeee7 --- /dev/null +++ b/content/blog/bash-traps-exit-error-sigint.md @@ -0,0 +1,77 @@ +--- +title: "Bash Traps: Exit, Error, Sigint" +date: 2024-01-02T11:26:06-05:00 +draft: false +tags: [] +math: false +medium_enabled: false +--- + +Traps in bash listen for interrupts and signals and performs a bash command in response to it. This post will go over three use cases I've encountered so far in my bash scripting journey. + +## `SIGINT` + +If we have a while loop within a bash script + +```bash +while sleep 0.1; do + do_something +done +``` + +We probably want to be able to CTRL-C to exit the whole script. + +```bash +finish () { + exit 0 +} +trap finish SIGINT + +while sleep 0.1; do + do_something +done +``` + +## `ERR` + +If we encounter an error in a bash script, one thing we might want to do is dump the environment information and other things that can be useful for debugging. + +```bash +set -o errexit +set -o nounset +set -o pipefail + +print_debug () { + declare exit_code=$? + env >&2 + other_debug_info >&2 + exit "$exit_code" +} + +trap print_debug ERR + +command_that_may_fail +``` + +## `EXIT` + +Like the last one, this function will occur if the script fails. However, this also occurs if the script is successful. It's similar to the `finally` clause within a `try-catch` programming paradigm. + +This is useful for cleaning up build files, de-provisioning services, etc. + +```bash +cleanup () { + rm a.tmp b.tmp + deprovision +} + +trap cleanup EXIT + +long_compile_may_fail +``` + +## Other Resources + +http://redsymbol.net/articles/bash-exit-traps/ + +https://jakski.github.io/pages/error-handling-in-bash.html