384 lines
8.4 KiB
Groff
384 lines
8.4 KiB
Groff
.\" $NetBSD: test.1,v 1.33 2017/10/18 18:11:54 wiz Exp $
|
|
.\"
|
|
.\" Copyright (c) 1991, 1993
|
|
.\" The Regents of the University of California. All rights reserved.
|
|
.\"
|
|
.\" This code is derived from software contributed to Berkeley by
|
|
.\" the Institute of Electrical and Electronics Engineers, Inc.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. Neither the name of the University nor the names of its contributors
|
|
.\" may be used to endorse or promote products derived from this software
|
|
.\" without specific prior written permission.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
.\" SUCH DAMAGE.
|
|
.\"
|
|
.\" @(#)test.1 8.1 (Berkeley) 5/31/93
|
|
.\"
|
|
.Dd October 17, 2017
|
|
.Dt TEST 1
|
|
.Os
|
|
.Sh NAME
|
|
.Nm test ,
|
|
.Nm \&[
|
|
.Nd condition evaluation utility
|
|
.Sh SYNOPSIS
|
|
.Nm
|
|
.Ar expression
|
|
.Nm \&[
|
|
.Ar expression Cm \&]
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Nm
|
|
utility evaluates
|
|
.Ar expression
|
|
and, if it evaluates
|
|
to true, returns a zero (true) exit status; otherwise
|
|
it returns 1 (false).
|
|
If
|
|
.Ar expression
|
|
is not given,
|
|
.Nm
|
|
also
|
|
returns 1 (false).
|
|
.Pp
|
|
All operators and flags are separate arguments to the
|
|
.Nm
|
|
utility.
|
|
.Pp
|
|
The following primaries are used to construct
|
|
.Ar expression :
|
|
.Bl -tag -width Ar
|
|
.It Fl b Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a block special
|
|
file.
|
|
.It Fl c Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a character
|
|
special file.
|
|
.It Fl d Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a directory.
|
|
.It Fl e Ar file
|
|
True if
|
|
.Ar file
|
|
exists (regardless of type).
|
|
.It Fl f Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a regular file.
|
|
.It Fl g Ar file
|
|
True if
|
|
.Ar file
|
|
exists and its set group ID flag
|
|
is set.
|
|
.It Fl h Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a symbolic link.
|
|
.It Fl k Ar file
|
|
True if
|
|
.Ar file
|
|
exists and its sticky bit is set.
|
|
.It Fl n Ar string
|
|
True if the length of
|
|
.Ar string
|
|
is nonzero.
|
|
.It Fl p Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a named pipe (FIFO).
|
|
.It Fl r Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is readable.
|
|
.It Fl s Ar file
|
|
True if
|
|
.Ar file
|
|
exists and has a size greater
|
|
than zero.
|
|
.It Fl t Ar file_descriptor
|
|
True if the file whose file descriptor number
|
|
is
|
|
.Ar file_descriptor
|
|
is open and is associated with a terminal.
|
|
.It Fl u Ar file
|
|
True if
|
|
.Ar file
|
|
exists and its set user ID flag
|
|
is set.
|
|
.It Fl w Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is writable.
|
|
True
|
|
indicates only that the write flag is on.
|
|
The file is not writable on a read-only file
|
|
system even if this test indicates true.
|
|
.It Fl x Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is executable.
|
|
True
|
|
indicates only that the execute flag is on.
|
|
If
|
|
.Ar file
|
|
is a directory, true indicates that
|
|
.Ar file
|
|
can be searched.
|
|
.It Fl z Ar string
|
|
True if the length of
|
|
.Ar string
|
|
is zero.
|
|
.It Fl L Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a symbolic link.
|
|
This operator is retained for compatibility with previous versions of
|
|
this program.
|
|
Do not rely on its existence; use
|
|
.Fl h
|
|
instead.
|
|
.It Fl O Ar file
|
|
True if
|
|
.Ar file
|
|
exists and its owner matches the effective user id of this process.
|
|
.It Fl G Ar file
|
|
True if
|
|
.Ar file
|
|
exists and its group matches the effective group id of this process.
|
|
.It Fl S Ar file
|
|
True if
|
|
.Ar file
|
|
exists and is a socket.
|
|
.It Ar file1 Fl nt Ar file2
|
|
True if
|
|
.Ar file1
|
|
exists and is newer than
|
|
.Ar file2 .
|
|
.It Ar file1 Fl ot Ar file2
|
|
True if
|
|
.Ar file1
|
|
exists and is older than
|
|
.Ar file2 .
|
|
.It Ar file1 Fl ef Ar file2
|
|
True if
|
|
.Ar file1
|
|
and
|
|
.Ar file2
|
|
exist and refer to the same file.
|
|
.It Ar string
|
|
True if
|
|
.Ar string
|
|
is not the null
|
|
string.
|
|
.It Ar \&s\&1 Cm \&= Ar \&s\&2
|
|
True if the strings
|
|
.Ar \&s\&1
|
|
and
|
|
.Ar \&s\&2
|
|
are identical.
|
|
.It Ar \&s\&1 Cm \&!= Ar \&s\&2
|
|
True if the strings
|
|
.Ar \&s\&1
|
|
and
|
|
.Ar \&s\&2
|
|
are not identical.
|
|
.It Ar \&s\&1 Cm \&< Ar \&s\&2
|
|
True if string
|
|
.Ar \&s\&1
|
|
comes before
|
|
.Ar \&s\&2
|
|
based on the ASCII value of their characters.
|
|
.It Ar \&s\&1 Cm \&> Ar \&s\&2
|
|
True if string
|
|
.Ar \&s\&1
|
|
comes after
|
|
.Ar \&s\&2
|
|
based on the ASCII value of their characters.
|
|
.It Ar \&n\&1 Fl \&eq Ar \&n\&2
|
|
True if the integers
|
|
.Ar \&n\&1
|
|
and
|
|
.Ar \&n\&2
|
|
are algebraically
|
|
equal.
|
|
.It Ar \&n\&1 Fl \&ne Ar \&n\&2
|
|
True if the integers
|
|
.Ar \&n\&1
|
|
and
|
|
.Ar \&n\&2
|
|
are not
|
|
algebraically equal.
|
|
.It Ar \&n\&1 Fl \> Ar \&n\&2
|
|
True if the integer
|
|
.Ar \&n\&1
|
|
is algebraically
|
|
greater than the integer
|
|
.Ar \&n\&2 .
|
|
.It Ar \&n\&1 Fl \&ge Ar \&n\&2
|
|
True if the integer
|
|
.Ar \&n\&1
|
|
is algebraically
|
|
greater than or equal to the integer
|
|
.Ar \&n\&2 .
|
|
.It Ar \&n\&1 Fl \< Ar \&n\&2
|
|
True if the integer
|
|
.Ar \&n\&1
|
|
is algebraically less
|
|
than the integer
|
|
.Ar \&n\&2 .
|
|
.It Ar \&n\&1 Fl \&le Ar \&n\&2
|
|
True if the integer
|
|
.Ar \&n\&1
|
|
is algebraically less
|
|
than or equal to the integer
|
|
.Ar \&n\&2 .
|
|
.El
|
|
.Pp
|
|
These primaries can be combined with the following operators:
|
|
.Bl -tag -width Ar
|
|
.It Cm \&! Ar expression
|
|
True if
|
|
.Ar expression
|
|
is false.
|
|
.It Ar expression1 Fl a Ar expression2
|
|
True if both
|
|
.Ar expression1
|
|
and
|
|
.Ar expression2
|
|
are true.
|
|
.It Ar expression1 Fl o Ar expression2
|
|
True if either
|
|
.Ar expression1
|
|
or
|
|
.Ar expression2
|
|
is true.
|
|
.It Cm \&( Ar expression Cm \&)
|
|
True if
|
|
.Ar expression
|
|
is true.
|
|
.El
|
|
.Pp
|
|
The
|
|
.Fl a
|
|
operator has higher precedence than the
|
|
.Fl o
|
|
operator.
|
|
.Pp
|
|
Note that all file tests with the exception of
|
|
.Fl h
|
|
and
|
|
.Fl L
|
|
follow symbolic links and thus evaluate the test for the file pointed at.
|
|
.Sh EXIT STATUS
|
|
The
|
|
.Nm
|
|
utility exits with one of the following values:
|
|
.Bl -tag -width Ds
|
|
.It 0
|
|
.Ar expression
|
|
evaluated to true.
|
|
.It 1
|
|
.Ar expression
|
|
evaluated to false or was missing.
|
|
.It >1
|
|
An error occurred.
|
|
.El
|
|
.Sh STANDARDS
|
|
The
|
|
.Nm
|
|
utility implements a superset of the
|
|
.St -p1003.2
|
|
specification.
|
|
.Sh HISTORY
|
|
A
|
|
.Nm
|
|
utility appeared in
|
|
.At v7 .
|
|
.Sh CAVEATS
|
|
The
|
|
.Nm
|
|
grammar is inherently ambiguous.
|
|
In order to assure a degree of consistency, the cases described in
|
|
.St -p1003.2
|
|
section 4.62.4,
|
|
are evaluated consistently according to the rules specified in the
|
|
standards document.
|
|
All other cases are subject to the ambiguity in the command semantics.
|
|
.Pp
|
|
This means that
|
|
.Nm
|
|
should not be used with more than 4 operands
|
|
(where the terminating
|
|
.Cm \&]
|
|
in the case of the
|
|
.Nm \&[
|
|
command does not count as an operand,)
|
|
and that the obsolete
|
|
.Fl a
|
|
and
|
|
.Fl o
|
|
options should not be used.
|
|
Instead invoke
|
|
.Nm
|
|
multiple times connected by the
|
|
.Dq &&
|
|
and
|
|
.Dq ||
|
|
operators from
|
|
.Xr sh 1 .
|
|
When those operators are not used, there is no need
|
|
for the parentheses as grouping symbols, so those should also be
|
|
avoided.
|
|
Using
|
|
.Xr sh 1 Ns 's
|
|
.Cm \&!
|
|
command instead of the equivalent operator from
|
|
.Nm
|
|
can also protect the script from future test enhancements.
|
|
.Pp
|
|
Most expressions with 3 or less operands will evaluate as expected,
|
|
though be aware that with 3 operands,
|
|
if the second is a known binary operator,
|
|
that is always evaluated,
|
|
regardless of what the other operands might suggest had been intended.
|
|
If, and only if, the middle operand is not a defined binary operator
|
|
is the first operand examined to see if it is
|
|
.Cm \&!
|
|
in which case the remaining operands are evaluated as a two operand test,
|
|
and the result inverted.
|
|
The only other defined three operand case is the meaningless
|
|
degenerate case where parentheses (1st and 3rd operands)
|
|
surround a one operand expression.
|
|
.Pp
|
|
With 4 operands there are just two defined cases, the first
|
|
where the first operand is
|
|
.Cm \&!
|
|
in which case the result of the three operand test on the
|
|
remaining operands is inverted,
|
|
and the second is similar to the 3 operand case,
|
|
the degenerate case of parentheses surrounding an (in this case)
|
|
2 operand test expression.
|