You must use "$@"
instead of $*
:
exec ./mysh1 "$@"
That's the right way to expand all positional arguments as separated words.
When you use $*
, all positional arguments was concatenated in to one long string, with the first value of IFS
as separator, which default to a whitespace, you got A B 2 C
.
Now, because you use $*
without double quote (which can lead to security implications and make your script choked), the shell perform split+glob
on it. The long string you got above was split into four words, A
, B
, 2
and C
.
Therefore, you actually passed four arguments to mysh1
instead of three.
"$@"
instead of$*
, note the quotes. See also: unix.stackexchange.com/q/41571/38906./mysh0
is an intermediate script that I do not own.mysh0
, because it decided how to pass argument tomysh1
.