ZheNing Hu <adlternative@xxxxxxxxx> 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 ...