Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: emulate -L sh impact on $0, $argv



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.



Messages sorted by: Reverse Date, Date, Thread, Author