• (bash) Does the EXIT trap fire if/when bash is exited via a signal?

    From Kenny McCormack@21:1/5 to All on Wed Aug 21 03:19:39 2024
    Note: This thread is entirely about bash. No other shells or "POSIX" are relevant here. But comparisons between various versions of bash may be relevant, since I think the behavior may have changed over the versions.

    That said, suppose I have something like:

    trap 'date > /tmp/somefile' EXIT

    # Rest of script

    Now, if during "Rest of script", say I hit ^C. Or ^\. Or, say I send a
    signal via "kill" from another terminal. Does my exit trap get executed?

    I've had varying results. I am pretty sure that at one point, the answer
    was "no", but recently, I've noticed that when I exit via ^C, the EXIT trap does execute. I'm curious what the "official" answer is.

    --
    The people who tell us to be proud of the white race are the ones who make
    us the most embarrassed by it.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Helmut Waitzmann@21:1/5 to All on Fri Aug 23 08:31:36 2024
    gazelle@shell.xmission.com (Kenny McCormack):
    Note: This thread is entirely about bash. No other shells or "POSIX" are relevant here. But comparisons between various versions of bash may be relevant, since I think the behavior may have changed over the versions.

    That said, suppose I have something like:

    trap 'date > /tmp/somefile' EXIT

    # Rest of script

    Now, if during "Rest of script", say I hit ^C. Or ^\. Or, say I send a signal via "kill" from another terminal. Does my exit trap get executed?

    I've had varying results. I am pretty sure that at one point, the answer
    was "no", but recently, I've noticed that when I exit via ^C, the EXIT trap does execute. I'm curious what the "official" answer is.


    The "official" answer should be in the "bash" documentation, but
    anyone who would like to investigate it, might let "bash" run the
    following script ("the_script")


    #!/bin/sh
    trap_command()
    {
    cat <<EOF
    printf 'Executing %s trap at ' ${1:?} &&
    date -- '+%F %T'
    EOF
    }

    command="$( trap_command EXIT )" &&
    trap "$command" EXIT &&

    for signal
    do
    (
    sleep -- 1 &&
    printf 'Sending signal %s at ' "$signal" &&
    date -- '+%F %T' &&
    kill -s "$signal" -- "$$"
    ) &
    sleep -- 3
    done


    providing signal names as parameters and observe what the shell
    will do, for example


    (
    for signal in INT QUIT HUP TERM
    do
    bash ./the_script "$signal"
    printf 'Script exited returning status %s\n' "$?"
    done
    )

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)