Re: [PATCH v4] [GSOC]trailer: pass arg as positional parameter
flat view
From: Junio C Hamano <hidden>
Date: 2021-03-30 17:15:23
ZheNing Hu [off-list ref] writes:
The `prepare_shell_cmd()` in "run-command.c" seem to use "$@" to pass shell args.
Yes. "$@" is a way to write "$1" "$2" "$3"... Since you are passing only one, echo "$@" and echo "$1" would be the equivalent. I am not sure what program you fed to the gdb (and remote debugging over e-mail is not my forte ;-), but let's see.
Before exec: (gdb) print argv.v[1] $22 = 0x5555558edfd0 "/bin/sh" (gdb) print argv.v[2] $23 = 0x5555558f4c80 "-c" (gdb) print argv.v[3] $24 = 0x5555558ed4b0 "echo \"123\" \"$@\"" (gdb) print argv.v[4] $25 = 0x5555558f5980 "echo \"123\"" (gdb) print argv.v[5] $26 = 0x5555558edab0 "abc" (gdb) print argv.v[6] $27 = 0x0 Some unexpected things happened here. Maybe "abc" was wrongly used as the parameter of "echo"? Looking forward to your reply.
Observe
$ sh -c '
echo "\$0 == $0"
count=0
for arg in "$@"
do
count=$(( $count + 1 ))
echo "\$$count == $arg"
done
' 0 1 2
$0 == 0
$1 == 1
$2 == 2
i.e. the first arg after
argv[1] = "/bin/sh"
argv[2] = "-c"
argv[3] = "script"
is used to give the script the name of the program ($0). Are we
getting hit by this common confusion?
It is customery to write such an invocation with '-' as the "name of
the program" thing, so that ordinary positional parameters are
available starting at $1, not $0, like so:
sh -c 'script' - arg1 arg2 ...