Junio C Hamano <gitster@xxxxxxxxx> writes: > Jeff King <peff@xxxxxxxx> writes: > >> But interestingly, that's _not_ the behavior as of Erik's 7f51f8b >> (alias: use run_command api to execute aliases, 2011-01-07), which is in >> master but not yet released. With that, we end up executing: >> >> sh -c 'echo $1 && echo $1 "$@"' 'echo $1 && echo $1' 'foo' >> >> which prints "foo foo". So it is technically a regression. I don't know >> how much we care; using positional parameters like this was already >> nonsensical, as shown above. >> >> For reference, what you actually want (in either system) is: >> >> $ git config alias.test1 >> !sh -c 'echo $1 && echo $1' - > > Oh, I should have been paying a bit more attention. I've been assuming > that we were turning "!anything" into { "sh", "-c", "anything", "-" } > followed by the user supplied arguments. The attached quick hack gives $ git config alias.silly !echo hello $1; echo $# args, bye! $ GIT_TRACE=1 ./git silly world funny trace: exec: 'git-silly' 'world' 'funny' trace: run_command: 'git-silly' 'world' 'funny' trace: run_command: 'sh' '-c' 'echo hello $1; echo $# args, bye'\!'' '-' 'world' 'funny' trace: exec: 'sh' '-c' 'echo hello $1; echo $# args, bye'\!'' '-' 'world' 'funny' hello world 2 args, bye! but it would penalize a properly written alias that uses "sh -c <it> -" trick itself by double forking, which is not very nice and I am unhappy about. git.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/git.c b/git.c index ef598c3..8d54466 100644 --- a/git.c +++ b/git.c @@ -183,11 +183,14 @@ static int handle_alias(int *argcp, const char ***argv) commit_pager_choice(); /* build alias_argv */ - alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1)); - alias_argv[0] = alias_string + 1; + alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 4)); + alias_argv[0] = "sh"; + alias_argv[1] = "-c"; + alias_argv[2] = alias_string + 1; + alias_argv[3] = "-"; for (i = 1; i < argc; ++i) - alias_argv[i] = (*argv)[i]; - alias_argv[argc] = NULL; + alias_argv[i + 3] = (*argv)[i]; + alias_argv[argc + 3] = NULL; ret = run_command_v_opt(alias_argv, RUN_USING_SHELL); if (ret >= 0) /* normal exit */ -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html