$LINENO within functions

Stefan Farfeleder stefan at fafoe.narf.at
Fri May 30 19:30:01 UTC 2008


On Fri, May 30, 2008 at 09:15:29PM +0300, Kostik Belousov wrote:
> On Fri, May 30, 2008 at 09:12:42PM +0300, Kostik Belousov wrote:
> > On Fri, May 30, 2008 at 07:27:12PM +0200, Stefan Farfeleder wrote:
> > > Hi,
> > > 
> > > SUSv3 says the following about $LINENO:
> > > 
> > > "Set by the shell to a decimal number representing the current
> > > sequential line number (numbered starting with 1) within a script or
> > > function before it executes each command. If the user unsets or resets
> > > LINENO , the variable may lose its special meaning for the life of the
> > > shell. If the shell is not currently executing a script or function, the
> > > value of LINENO is unspecified. This volume of IEEE Std 1003.1-2001
> > > specifies the effects of the variable only for systems supporting the
> > > User Portability Utilities option."
> > > 
> > > My initial interpretation of "or function" was that it means $LINENO
> > > within a function should be relative to the function's beginning line.
> > > Now I'm not so sure anymore.  Bash release 2.05b changed the expansion
> > > of $LINENO within functions to absolute numbering, stating this is
> > > required by POSIX.  But then I wonder about the meaning of "or
> > > function".  Does it mean functions in interactive scripts?  Because for
> > > functions in shell scripts the mentioning of both "script" and
> > > "function" seems redundant.
> > 
> > I do not know whether you need this data, but ksh93 and pdksh exhibit
> > the same behaviour as bash. For the rev. 1.1 of lineno.0, I got
> > 
> > 2
> > 3
> > 6
> > 7
> > 12
> > 13
> > foo
> > foo
> > 2
> > 
> > On the other hand, zsh produces
> > 
> > 2
> > 3
> > 1
> > 2
> > 12
> > 13
> > foo
> > foo
> > 2
> 
> Oh, and /usr/xpg4/bin/sh on the fully patches Solaris 10 output is identical
> with the zsh one.

Yes, the current implementation has a +1 offset compared to zsh.  The
reason is that $LINENO can occur on the same line as the function name
itself (ie. zsh prints 0 for 'f() { echo $LINENO }' which contradicts
the specification).


More information about the freebsd-standards mailing list