%prep setopt localtraps %test unsetopt DEBUG_BEFORE_CMD debug-trap-bug1() { setopt localtraps print "print bug file here" >bug-file print "print this is line one print this is line two print this is line three print and this is line fifty-nine." >bug-file2 function debug_trap_handler { print $functrace[1] do_bug } function do_bug { . ./bug-file } trap 'echo EXIT hit' EXIT trap 'debug_trap_handler' DEBUG . ./bug-file2 } debug-trap-bug1 0: Relationship between traps and sources >debug-trap-bug1:15 >bug file here >this is line one >./bug-file2:1 >bug file here >this is line two >./bug-file2:2 >bug file here >this is line three >./bug-file2:3 >bug file here >and this is line fifty-nine. >./bug-file2:4 >bug file here >debug-trap-bug1:16 >bug file here >EXIT hit cat >zsh-trapreturn-bug2 <<-'HERE' cmd='./fdasfsdafd' [[ -x $cmd ]] && rm $cmd set -o DEBUG_BEFORE_CMD trap '[[ $? -ne 0 ]] && exit 0' DEBUG $cmd # invalid command # Failure exit 10 HERE $ZTST_testdir/../Src/zsh -f ./zsh-trapreturn-bug2 2>erroutput.dif mystat=$? ( setopt extendedglob print ${"$(< erroutput.dif)"%%:[^:]#: ./fdasfsdafd} ) (( mystat == 0 )) 0: trapreturn handling bug is properly fixed >./zsh-trapreturn-bug2:5 fn() { setopt localtraps localoptions debugbeforecmd trap '(( LINENO == 4 )) && setopt errexit' DEBUG print $LINENO three print $LINENO four print $LINENO five [[ -o errexit ]] && print "Hey, ERREXIT is set!" } fn 1:Skip line from DEBUG trap >3 three >5 five # Assignments are a special case, since they use a simpler # wordcode type, so we need to test skipping them separately. fn() { setopt localtraps localoptions debugbeforecmd trap '(( LINENO == 4 )) && setopt errexit' DEBUG x=three x=four print $LINENO $x [[ -o errexit ]] && print "Hey, ERREXIT is set!" } fn 1:Skip assignment from DEBUG trap >5 three fn() { setopt localtraps localoptions debugbeforecmd trap 'print $LINENO' DEBUG [[ a = a ]] && print a is ok } fn 0:line numbers of complex sublists >3 >a is ok fn() { setopt localtraps localoptions debugbeforecmd trap 'print $LINENO' DEBUG print before x=' first second third' print $x } fn 0:line numbers of multiline assignments >3 >before >4 >7 > first > second > third fn() { emulate -L zsh; setopt debugbeforecmd trap 'print "$LINENO: '\''$ZSH_DEBUG_CMD'\''"' DEBUG print foo && print bar || print rod x=y print $x fn2() { echo wow } fn2 } fn 0:ZSH_DEBUG_CMD in debug traps >3: 'print foo && print bar || print rod' >foo >bar >6: 'x=y ' >7: 'print $x' >y >8: 'fn2 () { > echo wow >}' >9: 'fn2' >0: 'echo wow' >wow foo() { emulate -L zsh; setopt debugbeforecmd trap '[[ $ZSH_DEBUG_CMD == *bar* ]] && return 2' DEBUG echo foo echo bar } foo 2:Status of forced return from eval-style DEBUG trap >foo %clean rm -f bug-file bug-file2 erroutput.dif zsh-trapreturn-bug2