diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/exec.c | 18 | ||||
-rw-r--r-- | Src/options.c | 1 | ||||
-rw-r--r-- | Src/zsh.h | 1 |
3 files changed, 19 insertions, 1 deletions
diff --git a/Src/exec.c b/Src/exec.c index d65c0a91e..487838a25 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -865,6 +865,22 @@ execlist(Estate state, int dont_change_job, int exiting) * semi-colon or ampersand (`sublists'). */ code = *state->pc++; while (wc_code(code) == WC_LIST && !breaks && !retflag) { + int donedebug; + if (sigtrapped[SIGDEBUG] && isset(DEBUGBEFORECMD)) { + exiting = donetrap; + ret = lastval; + dotrap(SIGDEBUG); + lastval = ret; + donetrap = exiting; + noerrexit = oldnoerrexit; + /* + * Only execute the trap once per sublist, even + * if the DEBUGBEFORECMD option changes. + */ + donedebug = 1; + } else + donedebug = 0; + ltype = WC_LIST_TYPE(code); csp = cmdsp; @@ -969,7 +985,7 @@ sublist_done: noerrexit = oldnoerrexit; - if (sigtrapped[SIGDEBUG]) { + if (sigtrapped[SIGDEBUG] && !isset(DEBUGBEFORECMD) && !donedebug) { exiting = donetrap; ret = lastval; dotrap(SIGDEBUG); diff --git a/Src/options.c b/Src/options.c index 821773d2f..d5e5ee552 100644 --- a/Src/options.c +++ b/Src/options.c @@ -108,6 +108,7 @@ static struct optname optns[] = { {{NULL, "cshjunkiequotes", OPT_EMULATE|OPT_CSH}, CSHJUNKIEQUOTES}, {{NULL, "cshnullcmd", OPT_EMULATE|OPT_CSH}, CSHNULLCMD}, {{NULL, "cshnullglob", OPT_EMULATE|OPT_CSH}, CSHNULLGLOB}, +{{NULL, "debugbeforecmd", OPT_EMULATE}, DEBUGBEFORECMD}, {{NULL, "emacs", 0}, EMACSMODE}, {{NULL, "equals", OPT_EMULATE|OPT_ZSH}, EQUALS}, {{NULL, "errexit", OPT_EMULATE}, ERREXIT}, diff --git a/Src/zsh.h b/Src/zsh.h index 2f627a37f..6f70fd0df 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1602,6 +1602,7 @@ enum { CSHJUNKIEQUOTES, CSHNULLCMD, CSHNULLGLOB, + DEBUGBEFORECMD, EMACSMODE, EQUALS, ERREXIT, |