diff -urpN busybox-1.14.2/coreutils/test.c busybox-1.14.2-test/coreutils/test.c --- busybox-1.14.2/coreutils/test.c 2009-07-05 22:59:28.000000000 +0200 +++ busybox-1.14.2-test/coreutils/test.c 2009-07-17 01:46:28.000000000 +0200 @@ -571,7 +571,14 @@ static number_t nexpr(enum token n) nest_msg(">nexpr(%s)\n", TOKSTR[n]); if (n == UNOT) { - res = !nexpr(check_operator(*++args)); + n = check_operator(*++args); + if (n == EOI) { + /* special case: [ ! ], [ a -a ! ] are valid */ + /* IOW, "! ARG" may miss ARG */ + unnest_msg("op_type == BINOP) { /* "test [!] arg1 arg2" */ - args = &argv[0]; + args = argv; res = (binop() == 0); goto ret; } @@ -755,7 +762,7 @@ int test_main(int argc, char **argv) argv--; } #endif - args = &argv[0]; + args = argv; res = !oexpr(check_operator(*args)); if (*args != NULL && *++args != NULL) { diff -urpN busybox-1.14.2/testsuite/test.tests busybox-1.14.2-test/testsuite/test.tests --- busybox-1.14.2/testsuite/test.tests 2009-07-05 22:59:22.000000000 +0200 +++ busybox-1.14.2-test/testsuite/test.tests 2009-07-17 01:46:28.000000000 +0200 @@ -21,6 +21,11 @@ testing "test '': should be false (1)" \ "1\n" \ "" "" +testing "test !: should be true (0)" \ + "busybox test !; echo \$?" \ + "0\n" \ + "" "" + testing "test a: should be true (0)" \ "busybox test a; echo \$?" \ "0\n" \ @@ -51,6 +56,11 @@ testing "test -lt = -gt: should be false "1\n" \ "" "" +testing "test a -a !: should be true (0)" \ + "busybox test a -a !; echo \$?" \ + "0\n" \ + "" "" + testing "test -f = a -o b: should be true (0)" \ "busybox test -f = a -o b; echo \$?" \ "0\n" \