Hi, On Tue, 10 May 2016, Jeff King wrote: > On Tue, May 10, 2016 at 01:53:56PM -0700, Junio C Hamano wrote: > > > Jeff King <peff@xxxxxxxx> writes: > > > > > I think it is clear why it works. If $strategy_opts is empty, then the > > > code we generate looks like: > > > > > > for strategy_opt in > > > do > > > ... > > > done > > > > Ah, of course. Thanks. > > Here it is as a patch and commit message. > > -- >8 -- > Subject: [PATCH] rebase--interactive: avoid empty list in shell for-loop > > The $strategy_opts variable contains a space-separated list > of strategy options, each individually shell-quoted. To loop > over each, we "unwrap" them by doing an eval like: > > eval ' > for opt in '"$strategy_opts"' > do > ... > done > ' > > Note the quoting that means we expand $strategy_opts inline > in the code to be evaluated (which is the right thing > because we want the IFS-split and de-quoting). If the > variable is empty, however, we ask the shell to eval the > following code: > > for opt in > do > ... > done > > without anything between "in" and "do". Most modern shells > are happy to treat that like a noop, but reportedly ksh88 on > AIX considers it a syntax error. So let's catch the case > that the variable is empty and skip the eval altogether > (since we know the loop would be a noop anyway). > > Reported-by: Armin Kunaschik <megabreit@xxxxxxxxxxxxxx> > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > git-rebase--interactive.sh | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh > index 9ea3075..1c6dfb6 100644 > --- a/git-rebase--interactive.sh > +++ b/git-rebase--interactive.sh > @@ -82,6 +82,7 @@ rewritten_pending="$state_dir"/rewritten-pending > cr=$(printf "\015") > > strategy_args=${strategy:+--strategy=$strategy} > +test -n "$strategy_opts" && > eval ' > for strategy_opt in '"$strategy_opts"' > do Looks obviously correct to me. I had a look at our other shell scripts and it looks as if there is only one more candidate for this issue: git-bisect.sh has a couple of 'for arg in "$@"' constructs. But from a cursory look, it appears that none of these "$@" can be empty lists because at least one parameter is passed to those functions (check_expected_revs() is only called from bisect_state() with 1 or 2 parameters, bisect_skip() makes no sense without parameters, and bisect_state() has another for loop if it got 2 parameters). So I think we're fine. Ciao, Dscho -- 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