Lesmana Zimmer wrote:
> the bash manual says that BASH_SOURCE shows filename where a function is 
> defined 
> (and not the filename from where the function is called).


No, this is not true.  Nowhere it says that BASH_SOURCE holds the
filename where FUNCNAME is _defined_.  In fact, the documentation for
BASH_LINENO uses almost the exact same wording, but it holds the line
number where FUNCNAME is _called_.  So, at least the manual is not
clear about it.  Below I collected all relevant passages from the
manual and made some comments.  Still further below, you can find a
suggestion how the manual should be changed to have a clear
definition.

Concerning the bug report, I agree that BASH_SOURCE is correct if the
manual is updated correspondingly.  Earlier, somehow, I felt that
writing 

FUNCNAME[i] was called from file BASH_SOURCE[i] at line BASH_LINENO[i]

in a shell script is more correct than what needs to be written
currently, namely

FUNCNAME[i] was called from file BASH_SOURCE[i+1] at line BASH_LINENO[i]


The following is from the bash info pages.  My comments are not
indented.

`BASH_SOURCE'
     An array variable whose members are the source filenames
     corresponding to the elements in the `FUNCNAME' array variable.

This could mean the source filename where FUNCNAME was called OR the
source filename where FUNCNAME is defined.  Currently it holds the
filename where FUNCNAME is _defined_.

`FUNCNAME'
     An array variable containing the names of all shell functions
     currently in the execution call stack.  The element with index 0
     is the name of any currently-executing shell function.  The
     bottom-most element is `"main"'.  This variable exists only when a
     shell function is executing.  Assignments to `FUNCNAME' have no
     effect and return an error status.  If `FUNCNAME' is unset, it
     loses its special properties, even if it is subsequently reset.

No problem with the above.

`BASH_LINENO'
     An array variable whose members are the line numbers in source
     files corresponding to each member of FUNCNAME.

This is unclear again.  Essentially the same formulation as for
BASH_SOURCE is used.  Again, it could refer to the line number where
FUNCNAME is defined or where FUNCNAME was called.  Currently it holds
the line number where FUNCNAME is _called_.

     `${BASH_LINENO[$i]}' is the line number in the source file where
     `${FUNCNAME[$i]}' was called

Ok.

     (or `${BASH_LINENO[$i-1]}' if
     referenced within another shell function).  

The above does not make sense.  It should be removed.  First of all
the index should be $i+1 and not $i-1.  Second, if referenced within
another shell function also the index of FUNCNAME should be
incremented.

     The corresponding
     source file name is `${BASH_SOURCE[$i]}'.  

This is unclear again.  Source file where FUNCNAME was _called_ from or
where FUNCNAME is _defined_?

     Use `LINENO' to obtain the current line number.

Ok.

So BASH_SOURCE and BASH_LINENO are not defined consistently and the
manual is very vague about them.  In one case a filename where a
function is _defined_ is referenced and in the other case a line
number where a function is _called_.

Maybe the best solution would be to update the manual.  This would be
my suggestion:


`BASH_SOURCE'

     An array variable whose members are the source filenames where
     the corresponding elements in the `FUNCNAME' array variable are
     defined.  For instance the function `${FUNCNAME[$i]}' is defined
     in the file `${BASH_SOURCE[$i]}' (and was called from file
     `${BASH_SOURCE[$i+1]}'.  See `FUNCNAME'.

`BASH_LINENO'

     An array variable whose members are the line numbers in source
     files where the corresponding members of FUNCNAME where called.
     For instance the function `${FUNCNAME[$i]}' was called at line
     number `${BASH_LINENO[$i]}' (in the file `${BASH_SOURCE[$i+1]}').
     Use `LINENO' to obtain the current line number.  See `FUNCNAME'.

`FUNCNAME'

     An array variable containing the names of all shell functions
     currently in the execution call stack.  The element with index 0
     is the name of any currently-executing shell function.  The
     bottom-most element is `"main"'.  This variable exists only when a
     shell function is executing.  Assignments to `FUNCNAME' have no
     effect and return an error status.  If `FUNCNAME' is unset, it
     loses its special properties, even if it is subsequently reset.

     This variable is most useful together with `BASH_SOURCE' and
     `BASH_LINENO'.  For instance `${FUNCNAME[0]}' is the name of the
     currently running function, it was called in file
     `${BASH_SOURCE[1]}' at line number `${BASH_LINENO[0]}'.  To print
     a back trace of the call stack to stderr use the following
     function

     BT () {
     i=1  # leave out BT from the call stack; set to 0 to include BT
     until test "${FUNCNAME[$i]}" = "main"
     do 
        echo "${FUNCNAME[$i]} called from 
${BASH_SOURCE[$i+1]}:${BASH_LINENO[$i]}" >&2 
        let i++
     done 
     }

-- 
BASH_SOURCE is not correct
https://bugs.launchpad.net/bugs/318678
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to