bash-preexec icon indicating copy to clipboard operation
bash-preexec copied to clipboard

preexec called twice when SIGINT trap is used

Open danieltodor opened this issue 1 year ago • 1 comments

Function added to preexec_functions is called twice when it is also added to a SIGINT trap and ^C is pressed.

Test code for bash:

test() {
    echo $1
}

trap "test sigint" INT

preexec_functions+=(test)

source ~/.bash-preexec.sh

PS1="❯ "

Without the trap the output has no problem when i press ^C 3 times. The preexec was not called.

❯ ^C
❯ ^C
❯ ^C
❯

But when the trap is enabled then the test func is called 2 times per each ^C. Once with the last command from preexec, once with the argument from the trap.

clear
sigint

clear
sigint

clear
sigint

❯

With a similar test code, zsh doesn't have this weird behavior. test is only called from the trap.

❯ sigint

❯ sigint

❯ sigint

❯

The zsh equivalent test code:

test() {
    echo $1
}

TRAPINT() {
    test sigint
    return $(( 128 + $1 ))
}

autoload -Uz add-zsh-hook
add-zsh-hook preexec test

PROMPT="❯ "

danieltodor avatar Aug 10 '24 13:08 danieltodor

Due to the current approach of preexec using the DEBUG trap, I think there is no way to distinguish the execution of a trap handler from that of a user command. In Bash 5.3+, one might use PS0 + funsub as a more robust implementation of preexec.

akinomyoga avatar Aug 11 '24 12:08 akinomyoga