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;
}