Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-unknown-linux-gnu' -DCONF_VENDOR='unknown' -DLOCALEDIR='/usr/local/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -g -O2 uname output: Linux lxjima 3.11.0-26-generic #45-Ubuntu SMP Tue Jul 15 04:02:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux Machine Type: x86_64-unknown-linux-gnu
Bash Version: 4.3 Patch Level: 0 Release Status: release Description: The "source" (or ".") command, if invoked from within a function, creates a call frame, setting $FUNCNAME[0] to "source" and $BASH_SOURCE[1] and $BASH_LINENO[1] to the location of the "source" statement. However this does not occur if the "source" statement occurs in mainline code, i.e. outside of any function. This means that code in "sourced" files can not reliably display the location of their call, i.e., the location of the "source" (or ".") statement which invoked them. Repeat-By: cat <<'EOF' >/tmp/sourced echo "\$@=$@ \$0=$0 #FUNCNAME=${#FUNCNAME[@]}" for ((i=0 ; i < ${#FUNCNAME[@]}; i=i+1)) ; do echo "(i=$i) FUNCNAME ${FUNCNAME[$i]} called from line ${BASH_LINENO[$i]} in ${BASH_SOURCE[$i+1]}" done EOF cat <<'EOF' >/tmp/test #!/bin/bash myfunc() { echo "----- Sourcing from inside a function:" source /tmp/sourced } myfunc echo "----- Sourcing from mainline code:" source /tmp/sourced EOF bash /tmp/test Actual Results: ----- Sourcing from inside function: $@= $0=/tmp/test #FUNCNAME=3 (i=0) FUNCNAME source called from line 4 in /tmp/test (i=1) FUNCNAME myfunc called from line 6 in /tmp/test (i=2) FUNCNAME main called from line 0 in ----- Sourcing directly from mainline code: $@= $0=/tmp/test #FUNCNAME=0 Expected Results: ----- Sourcing from inside function: $@= $0=/tmp/test #FUNCNAME=3 (i=0) FUNCNAME source called from line 4 in /tmp/test (i=1) FUNCNAME myfunc called from line 6 in /tmp/test (i=2) FUNCNAME main called from line 0 in ----- Sourcing directly from mainline code: $@= $0=/tmp/test #FUNCNAME=1 (i=0) FUNCNAME source called from line 8 in /tmp/test [(i=1) FUNCNAME main called from line 0 in ]