Subject: Re: emulate -L sh impact on $0, $argv
From: Bart Schaefer <[email-masked]>
To: Zsh hackers list <[email-masked]>
Date: Sun, 31 Jan 2016 12:37:45 -0800
List-Id: Zsh Workers List <zsh-workers.zsh.org>

On Jan 31,  8:13pm, Sebastian Gniazdowski wrote:
}
} In sh argv[0] is the same as argv[1]? Because again, you say I
} shouldn't be able to use argv[0] without KSH_ARRAYS, but in the
} examples, I do

This is a side-effect KSH_ARRAYS combined with the behavior of
$argv / $* / $@ when in the "source" command.  Doc of "." command:

     If any arguments ARG are given, they become the positional
     parameters; the old positional parameters are restored when the
     FILE is done executing.

What's left unsaid there is that if NO arguments are given, then the
positional parameters REMAIN THOSE OF THE CALLING CONTEXT.  So argv[0]
in your example is not test_file.sh's $0, it's the "source" FUNCTION's
$argv[1].

If you change your example to:

echo 'echo 0 is $0, argv0 is ${argv[0]}, argv1 is ${argv[1]}' > test_file.sh;
source ./test_file.sh ARGUMENT

Then the zsh case

    source() { emulate -L zsh; builtin source "$@"; }

will give

    0 is ./test_file.sh, argv0 is , argv1 is ARGUMENT

whereas the sh case

    source() { emulate -L sh; builtin source "$@"; }

yields

    0 is source, argv0 is ARGUMENT, argv1 is 

With KSH_ARRAYS set, $argv[0] == $1, $argv[1] == $2, etc.