prepare_shell_cmd() executes /bin/sh with superfluous arguments on all but single-word shell commands.
For example, if .git/config has this alias (the sleep is to leave time to examine output from ps, &c.): [alias] tryme = "!echo $PWD;sleep 600" running "git tryme" in one console and checking what it does in another --- 1st xterm 16:42:12$ git tryme /usr/src/git/.git echo $PWD;sleep 600: line 1: 2602 Terminated sleep 600 16:43:15$ --- 2nd xterm 16:42:06$ ps axf|grep -A2 trym[e] 2599 pts/4 S+ 0:00 \_ git tryme 2601 pts/4 S+ 0:00 \_ /bin/sh -c echo $PWD;sleep 600 echo $PWD;sleep 600 2602 pts/4 S+ 0:00 \_ sleep 600 16:42:45$ cat /proc/2601/cmdline | xargs -0 -n1 echo /bin/sh -c echo $PWD;sleep 600 echo $PWD;sleep 600 16:43:04$ kill 2602 16:43:15$ --- There is an extra "-c" argument. This is caused by a missing "else", fixed by the appended patch, Cheers ... Duncan. ----------8<------------------- --- a/run-command.c +++ b/run-command.c @@ -182,8 +182,8 @@ static const char **prepare_shell_cmd(struct argv_array *out, const char **argv) else argv_array_pushf(out, "%s \"$@\"", argv[0]); } - - argv_array_pushv(out, argv); + else + argv_array_pushv(out, argv); return out->argv; }