Problem with test(1)

Dan Nelson dnelson at
Thu Apr 5 15:08:23 UTC 2007

In the last episode (Apr 05), Joe Marcus Clarke said:
> I noticed something weird with test(1) when I ran across a problem port
> Makefile.  Our test(1) doesn't properly check to make sure there is an
> operand argument to unary operators like -f.  For example:
> test -f
> Will print "TRUE" on FreeBSD.  On Solaris, it will die:
> /usr/bin/test[8]: test: argument expected
> I think this patch is correct in that it does fix the problem, and the
> and TEST.csh regression scripts report the same results pre and
> post-patch.  Comments?

If you follow POSIX's description of test, FreeBSD's current behaviour
is valid and Solaris isn't:

  The algorithm for determining the precedence of the operators and the
  return value that shall be generated is based on the number of
  arguments presented to test. (However, when using the "[...]" form,
  the right-bracket final argument shall not be counted in this

  In the following list, $1, $2, $3, and $4 represent the arguments
  presented to test:

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

Unary operators shouldn't get parsed as such unless there are two

	Dan Nelson
	dnelson at

More information about the freebsd-hackers mailing list