summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorRasmus Villemoes <[email protected]>2026-03-12 11:01:06 +0100
committerTom Rini <[email protected]>2026-03-25 14:37:55 -0600
commit8b0619579b2282050e7fb0d92fbc645b79d18bae (patch)
tree9f2fd0ce8625dc8a5709f423420ec232c9a9f51b /cmd
parent6f9cc3310a764aaae4478b5a8a0c0cae3b2be4a1 (diff)
cmd: test: fix handling of single-argument form of test
POSIX states that 0 arguments: Exit false (1). 1 argument: Exit true (0) if $1 is not null; otherwise, exit false. and at least bash and busybox sh behave that way. The current 'argc < 3' does the right thing for a non-existing or empty argv[1], but not for a non-empty argv[1]. Fix that and add corresponding test cases. Signed-off-by: Rasmus Villemoes <[email protected]> Tested-by: Anshul Dalal <[email protected]>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/test.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/cmd/test.c b/cmd/test.c
index f0645ef98f1..0d0f090386c 100644
--- a/cmd/test.c
+++ b/cmd/test.c
@@ -71,10 +71,17 @@ static int do_test(struct cmd_tbl *cmdtp, int flag, int argc,
argc--;
}
- /* args? */
- if (argc < 3)
+ /*
+ * Per POSIX, 'test' with 0 arguments should return 1, while
+ * 'test <arg>' should be equivalent to 'test -n <arg>',
+ * i.e. true if and only if <arg> is not empty.
+ */
+ if (argc < 2)
return 1;
+ if (argc == 2)
+ return !strcmp(argv[1], "");
+
#ifdef DEBUG
{
debug("test(%d):", argc);