|True if file exists and is a block special file.|
|True if file exists and is a character special file.|
|True if file exists and is a directory.|
|True if file exists (regardless of type).|
|True if file exists and is a regular file.|
|True if file exists and its set group ID flag is set.|
|True if 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 -L instead.|
|True if file exists and its sticky bit is set.|
|True if the length of string is nonzero.|
|True if file is a named pipe (FIFO).|
|True if file exists and is readable.|
|True if file exists and has a size greater than zero.|
|True if the file whose file descriptor number is file_descriptor is open and is associated with a terminal.|
|True if file exists and its set user ID flag is set.|
|True if 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.|
|True if file exists and is executable. True indicates only that the execute flag is on. If file is a directory, true indicates that file can be searched.|
|True if the length of string is zero.|
|True if file exists and is a symbolic link.|
|True if file exists and its owner matches the effective user id of this process.|
|True if file exists and its group matches the effective group id of this process.|
|True if file exists and is a socket.|
|True if file1 exists and is newer than file2.|
|True if file1 exists and is older than file2.|
|True if file1 and file2 exist and refer to the same file.|
|True if string is not the null string.|
|s1 = s2|
|True if the strings s1 and s2 are identical.|
|s1 != s2|
|True if the strings s1 and s2 are not identical.|
|s1 < s2|
|True if string s1 comes before s2 based on the binary value of their characters.|
|s1 > s2|
|True if string s1 comes after s2 based on the binary value of their characters.|
|True if the integers n1 and n2 are algebraically equal.|
|True if the integers n1 and n2 are not algebraically equal.|
|True if the integer n1 is algebraically greater than the integer n2.|
|True if the integer n1 is algebraically greater than or equal to the integer n2.|
|True if the integer n1 is algebraically less than the integer n2.|
|True if the integer n1 is algebraically less than or equal to the integer n2.|
If file is a symbolic link, test will fully dereference it and then evaluate the expression against the file referenced, except for the -h and -L primaries.
These primaries can be combined with the following operators:
|True if expression is false.|
|True if both expression1 and expression2 are true.|
|True if either expression1 or expression2 are true.|
|( expression )|
|True if expression is true.|
The -a operator has higher precedence than the -o operator.
Some shells may provide a builtin test command which is similar or identical to this utility. Consult the builtin(1) manual page.
The test grammar is inherently ambiguous. In order to assure a degree of consistency, the cases described in the -p1003.2, section D11.2/4.62.4, standard are evaluated consistently according to the rules specified in the standards document. All other cases are subject to the ambiguity in the command semantics.
In particular, only expressions containing -a , -o , ( or ) can be ambiguous.
The test utility exits with one of the following values:
0 expression evaluated to true. 1 expression evaluated to false or expression was missing. >1 An error occurred.
Implement test FILE1 -nt FILE2 using only POSIX functionality:
test -n $(find -L -- FILE1 -prune -newer FILE2 2>/dev/null)
This can be modified using non-standard find(1) primaries like -newerca to compare other timestamps.
For compatibility with some other implementations, the = primary can be substituted with == with the same meaning.
The test utility implements a superset of the -p1003.2 specification. The primaries <, ==, >, -ef , -nt , -ot , -G , and -O are extensions.
Both sides are always evaluated in -a and -o . For instance, the writable status of file will be tested by the following command even though the former expression indicated false, which results in a gratuitous access to the file system:
[ -z abc -a -w file ]
To avoid this, write
[ -z abc ] && [ -w file ]