Hello all, I'm using Bash 5.2 on macOS: ----- bash-5.2$ bash -version GNU bash, version 5.2.37(1)-release (aarch64-apple-darwin23.4.0) Copyright (C) 2022 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> -----
I reached out to #bash on Libera about the following little "loop.sh" test program and they advised me to post to this list: ----- #!/usr/bin/env bash # https://paste.debian.net/hidden/3e73a580/ _int() { printf '\nBEGIN TRAP\n' interrupted=true trap - INT printf 'END TRAP\n' } loop() { local interrupted=false trap _int INT printf 'BEFORE WHILE LOOP\ninterrupted: %s\n' "$interrupted" while ! "$interrupted"; do echo "interrupted: $interrupted" printf 'interrupted: %s\n' "$interrupted" sleep 0.5 done printf 'AFTER WHILE LOOP\ninterrupted: %s\n' "$interrupted" "$interrupted" && kill -s INT -- "$$" } if [ -n "$BASH_VERSION" ] && [ "${BASH_SOURCE[0]}" = "$0" ]; then loop "$@" fi ----- • When I execute the loop.sh script, hitting CTRL+C ends up running the _int() function: ----- bash-5.2$ ./loop.sh BEFORE WHILE LOOP interrupted: false interrupted: false interrupted: false interrupted: false interrupted: false ^C BEGIN TRAP END TRAP AFTER WHILE LOOP interrupted: true ----- • When I source loop.sh then execute the loop() function, hitting CTRL+C interrupts the script but the _int() function is not executed which also means the trap for SIGINT is not cleared out: ----- bash-5.2$ source ./loop.sh bash-5.2$ loop BEFORE WHILE LOOP interrupted: false interrupted: false interrupted: false interrupted: false interrupted: false ^C bash-5.2$ trap trap -- '_int' SIGINT ----- • When I disable job control and launch the loop() function again, it behaves the same as when I execute the script: ----- bash-5.2$ set +m bash-5.2$ loop BEFORE WHILE LOOP interrupted: false interrupted: false interrupted: false interrupted: false interrupted: false interrupted: false interrupted: false ^C BEGIN TRAP END TRAP AFTER WHILE LOOP interrupted: true bash-5.2$ trap bash-5.2$ ----- Can someone please explain what's going on here? How does job control affect whether traps are being executed? Thank you, Grégory