On Fri, 15 Dec 2023 17:21:23 -0400
Giacomo Comes <gco...@gmx.com> wrote:

> Hi,
> I have stumbled upon a bug or something I don't understand while
> using the debug trap.
> Please run the script at the end.
> When debug is turned on, during its execution the program
> prints the line number and the line content which returned a non
> zero value (error).
> 
> If you look at the script, the only line which should cause
> a non zero return value is:
>   ! :
> However the script shows also a non zero return value
> before executing the 'true' command.
> I can only imagine that the sequence
>   if ((0)); then
> before the 'else' is the one causing a non zero
> return value, however the previous:
>   if ((0)); then
>     :
>   fi
> (without the else clause) does not cause a non zero return value.
> Is this the expected behavior (and if yes why)?

Yes, it is to be expected.

$ if false; then true; else echo "$?"; fi
1

> Or is it a bug?
> Seen in bash 4.4 and 5.2.
> 
> Giacomo Comes
> 
> #!/bin/bash
> debugon () {
>     trap 'if (($?)); then echo "$((LINENO-1)): $(sed -n "$((LINENO-1))p" 
> "$0")" ; fi' DEBUG
> }

The trap here ought to report LINENO without deducting 1. Otherwise, it is a a 
recipe for confusion.

> debugoff () {
>     trap '' DEBUG
> }
> debugon
> 
> :
> ! :
> if ((1)); then
>   :
> fi
> if ((0)); then
>   :
> fi
> if ((1)); then
>   :
> else
>   :
> fi
> if ((0)); then
>   :
> else

At this point, the value of $? is 1, prior to executing true - a simple 
command. Just as for any other simple command, the trap code shall be executed 
beforehand. Consequently, your test observes that $? is arithmetically false 
and acts accordingly. Keep in mind that this is the only part of your script in 
which an "else" clause is actually reached.

>   true
> fi
> 
> debugoff
> 
> 

-- 
Kerin Millar

Reply via email to