提交 268ef4d3 编写于 作者: J Jeff King 提交者: Junio C Hamano

always quote shell arguments to test -z/-n

In shell code like:

  test -z $foo
  test -n $foo

that does not quote its arguments, it's easy to think that
it is actually looking at the contents of $foo in each case.
But if $foo is empty, then "test" does not see any argument
at all! The results are quite subtle.

POSIX specifies that test's behavior depends on the number
of arguments it sees, and if $foo is empty, it sees only
one. The behavior in this case is:

  1 argument: Exit true (0) if $1 is not null; otherwise,
              exit false.

So in the "-z $foo" case, if $foo is empty, then we check
that "-z" is non-null, and it returns success. Which happens
to match what we expected.  But for "-n $foo", if $foo is
empty, we'll see that "-n" is non-null and still return
success. That's the opposite of what we intended!

Furthermore, if $foo contains whitespace, we'll end up with
more than 2 arguments. The results in this case are
generally unspecified (unless the first part of $foo happens
to be a valid binary operator, in which case the results are
specified but certainly not what we intended).

And on top of this, even though "test -z $foo" _should_ work
for the empty case, some older shells (reportedly ksh88)
complain about the missing argument.

So let's make sure we consistently quote our variable
arguments to "test". After this patch, the results of:

  git grep 'test -[zn] [^"]'

are empty.
Reported-by: NArmin Kunaschik <megabreit@googlemail.com>
Helped-by: NJunio C Hamano <gitster@pobox.com>
Signed-off-by: NJeff King <peff@peff.net>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 2a86cb6d
...@@ -866,12 +866,12 @@ add_exec_commands () { ...@@ -866,12 +866,12 @@ add_exec_commands () {
# $3: the input filename # $3: the input filename
check_commit_sha () { check_commit_sha () {
badsha=0 badsha=0
if test -z $1 if test -z "$1"
then then
badsha=1 badsha=1
else else
sha1_verif="$(git rev-parse --verify --quiet $1^{commit})" sha1_verif="$(git rev-parse --verify --quiet $1^{commit})"
if test -z $sha1_verif if test -z "$sha1_verif"
then then
badsha=1 badsha=1
fi fi
......
...@@ -185,7 +185,7 @@ store_stash () { ...@@ -185,7 +185,7 @@ store_stash () {
git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit
ret=$? ret=$?
test $ret != 0 && test -z $quiet && test $ret != 0 && test -z "$quiet" &&
die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")" die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")"
return $ret return $ret
} }
...@@ -277,7 +277,7 @@ save_stash () { ...@@ -277,7 +277,7 @@ save_stash () {
git clean --force --quiet -d $CLEAN_X_OPTION git clean --force --quiet -d $CLEAN_X_OPTION
fi fi
if test "$keep_index" = "t" && test -n $i_tree if test "$keep_index" = "t" && test -n "$i_tree"
then then
git read-tree --reset -u $i_tree git read-tree --reset -u $i_tree
fi fi
......
...@@ -82,7 +82,7 @@ test_expect_success 'am -3 --abort removes otherfile-4' ' ...@@ -82,7 +82,7 @@ test_expect_success 'am -3 --abort removes otherfile-4' '
test 4 = "$(cat otherfile-4)" && test 4 = "$(cat otherfile-4)" &&
git am --abort && git am --abort &&
test_cmp_rev initial HEAD && test_cmp_rev initial HEAD &&
test -z $(git ls-files -u) && test -z "$(git ls-files -u)" &&
test_path_is_missing otherfile-4 test_path_is_missing otherfile-4
' '
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册