It looks like the source builtin pushes its own argc and argv onto the arrays but only if it is called with no other arguments.
$ cat /tmp/s fun() { declare -p BASH_ARGC BASH_ARGV; } fun arg $ shopt -u extdebug; source /tmp/s declare -a BASH_ARGC=([0]="1") declare -a BASH_ARGV=([0]="/tmp/s") $ shopt- u extdebug; source /tmp/s foo declare -a BASH_ARGC=() declare -a BASH_ARGV=()