Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: leftover debugging statements?

ramos@xxxxxxxxxxxxxxxxxxxx wrote:
> hello,
> Did somebody leave some leftover debugging statements in
> zsh 3.0.5?
> Some assignments to a local (typeset) variable cause
> some garbage to be printed out.
> Example script & output (sorry I don't have time to
> isolate this any further... I hope this is enough to
> jog someone's memory):
> PS1='zsh> '
> zsh> which bug
> bug () {
>         typeset fred
>         fred=NULL
>         typeset sourcefile
>         echo 'Start loop...'
>         for sourcefile in $*
>         do
>                 typeset bar
>                 if [[ $fred = NULL ]]
>                 then
>                         typeset foo
>                         foo=(`echo output from some process`)
>                         bar=$foo[0]
>                 else
>                         bar=$fred
>                 fi
>         done
>         echo 'End loop...'
>         return 0
> }

Using zsh 3.1.2b I get the following:

zsh> bug X Y Z
Start loop...
End loop...

where the system is:

zsh> uname -a
SunOS voltera 5.5.1 Generic sun4u sparc SUNW,Ultra-1

The 'bar=output' lines occur when the 'typeset bar' line is
executed, because the previously declared bar is still in scope.
Therefore 'typeset bar' has the same effect as typing 'typeset PATH'
at the prompt, i.e. it returns the current value of the variable
rather than declaring a fresh variable.

The scoping rules for typeset in the Z Shell Guide only mention
being local to a function (unless I've missed something), so that I
expect to get the same output as below

> zsh> bug X Y Z
> Start loop...
> bar=output
> foo=(output from some process)
> bar=output
> foo=(output from some process)
> End loop...

Either moving the typeset statements out of the loop or inserting
unset statements removes the extraneous output.

On my system, using the original bug program leads to the variable foo
being persistant. It may be overwritten with 'foo=...' but any attempt
to unset foo (even after it has been overwritten) resets foo to the
value 'output from some process'.

Messages sorted by: Reverse Date, Date, Thread, Author