blob: f1444000ea2acf5b37701d3b66ba3133a438dd23 [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001This file is test.def, from which is created test.c.
2It implements the builtin "test" in Bash.
3
Chet Ramey495aee42011-11-22 19:11:26 -05004Copyright (C) 1987-2010 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00005
6This file is part of GNU Bash, the Bourne Again SHell.
7
Jari Aalto31859422009-01-12 13:36:28 +00008Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000012
Jari Aalto31859422009-01-12 13:36:28 +000013Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000017
Jari Aalto31859422009-01-12 13:36:28 +000018You should have received a copy of the GNU General Public License
19along with Bash. If not, see <http://www.gnu.org/licenses/>.
Jari Aalto726f6381996-08-26 18:22:31 +000020
21$PRODUCES test.c
22
23$BUILTIN test
24$FUNCTION test_builtin
25$SHORT_DOC test [expr]
Jari Aalto31859422009-01-12 13:36:28 +000026Evaluate conditional expression.
27
Jari Aalto7117c2d2002-07-17 14:10:11 +000028Exits with a status of 0 (true) or 1 (false) depending on
Jari Aalto726f6381996-08-26 18:22:31 +000029the evaluation of EXPR. Expressions may be unary or binary. Unary
30expressions are often used to examine the status of a file. There
Chet Ramey495aee42011-11-22 19:11:26 -050031are string operators and numeric comparison operators as well.
32
33The behavior of test depends on the number of arguments. Read the
34bash manual page for the complete specification.
Jari Aalto726f6381996-08-26 18:22:31 +000035
36File operators:
37
Jari Aalto31859422009-01-12 13:36:28 +000038 -a FILE True if file exists.
39 -b FILE True if file is block special.
40 -c FILE True if file is character special.
41 -d FILE True if file is a directory.
42 -e FILE True if file exists.
43 -f FILE True if file exists and is a regular file.
44 -g FILE True if file is set-group-id.
45 -h FILE True if file is a symbolic link.
46 -L FILE True if file is a symbolic link.
47 -k FILE True if file has its `sticky' bit set.
48 -p FILE True if file is a named pipe.
49 -r FILE True if file is readable by you.
50 -s FILE True if file exists and is not empty.
51 -S FILE True if file is a socket.
52 -t FD True if FD is opened on a terminal.
53 -u FILE True if the file is set-user-id.
54 -w FILE True if the file is writable by you.
55 -x FILE True if the file is executable by you.
56 -O FILE True if the file is effectively owned by you.
57 -G FILE True if the file is effectively owned by your group.
58 -N FILE True if the file has been modified since it was last read.
Jari Aalto726f6381996-08-26 18:22:31 +000059
Jari Aaltocce855b1998-04-17 19:52:44 +000060 FILE1 -nt FILE2 True if file1 is newer than file2 (according to
61 modification date).
Jari Aalto726f6381996-08-26 18:22:31 +000062
63 FILE1 -ot FILE2 True if file1 is older than file2.
64
65 FILE1 -ef FILE2 True if file1 is a hard link to file2.
66
67String operators:
68
Jari Aalto31859422009-01-12 13:36:28 +000069 -z STRING True if string is empty.
Jari Aalto726f6381996-08-26 18:22:31 +000070
Jari Aalto31859422009-01-12 13:36:28 +000071 -n STRING
72 STRING True if string is not empty.
Jari Aalto726f6381996-08-26 18:22:31 +000073
Jari Aalto31859422009-01-12 13:36:28 +000074 STRING1 = STRING2
75 True if the strings are equal.
76 STRING1 != STRING2
77 True if the strings are not equal.
78 STRING1 < STRING2
79 True if STRING1 sorts before STRING2 lexicographically.
80 STRING1 > STRING2
81 True if STRING1 sorts after STRING2 lexicographically.
Jari Aalto726f6381996-08-26 18:22:31 +000082
83Other operators:
84
Jari Aalto31859422009-01-12 13:36:28 +000085 -o OPTION True if the shell option OPTION is enabled.
Chet Ramey495aee42011-11-22 19:11:26 -050086 -v VAR True if the shell variable VAR is set
Chet Rameyac50fba2014-02-26 09:36:43 -050087 -R VAR True if the shell variable VAR is set and is a name reference.
Jari Aalto31859422009-01-12 13:36:28 +000088 ! EXPR True if expr is false.
89 EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
90 EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.
Jari Aalto726f6381996-08-26 18:22:31 +000091
Jari Aalto31859422009-01-12 13:36:28 +000092 arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne,
93 -lt, -le, -gt, or -ge.
Jari Aalto726f6381996-08-26 18:22:31 +000094
95Arithmetic binary operators return true if ARG1 is equal, not-equal,
96less-than, less-than-or-equal, greater-than, or greater-than-or-equal
97than ARG2.
Jari Aalto31859422009-01-12 13:36:28 +000098
99Exit Status:
100Returns success if EXPR evaluates to true; fails if EXPR evaluates to
101false or an invalid argument is given.
Jari Aalto726f6381996-08-26 18:22:31 +0000102$END
103
104$BUILTIN [
105$DOCNAME test_bracket
106$FUNCTION test_builtin
107$SHORT_DOC [ arg... ]
Jari Aalto31859422009-01-12 13:36:28 +0000108Evaluate conditional expression.
109
110This is a synonym for the "test" builtin, but the last argument must
111be a literal `]', to match the opening `['.
Jari Aalto726f6381996-08-26 18:22:31 +0000112$END
113
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000114#include <config.h>
115
116#if defined (HAVE_UNISTD_H)
Jari Aaltocce855b1998-04-17 19:52:44 +0000117# ifdef _MINIX
118# include <sys/types.h>
119# endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000120# include <unistd.h>
121#endif
122
123#include "../bashansi.h"
Jari Aalto31859422009-01-12 13:36:28 +0000124#include "../bashintl.h"
Jari Aalto726f6381996-08-26 18:22:31 +0000125
126#include "../shell.h"
Jari Aaltocce855b1998-04-17 19:52:44 +0000127#include "../test.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000128#include "common.h"
129
Jari Aalto726f6381996-08-26 18:22:31 +0000130extern char *this_command_name;
131
132/* TEST/[ builtin. */
133int
134test_builtin (list)
135 WORD_LIST *list;
136{
137 char **argv;
138 int argc, result;
Jari Aalto726f6381996-08-26 18:22:31 +0000139
140 /* We let Matthew Bradburn and Kevin Braunsdorf's code do the
141 actual test command. So turn the list of args into an array
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000142 of strings, since that is what their code wants. */
143 if (list == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000144 {
145 if (this_command_name[0] == '[' && !this_command_name[1])
Jari Aaltob72432f1999-02-19 17:11:39 +0000146 {
Jari Aalto31859422009-01-12 13:36:28 +0000147 builtin_error (_("missing `]'"));
Jari Aaltob72432f1999-02-19 17:11:39 +0000148 return (EX_BADUSAGE);
149 }
Jari Aalto726f6381996-08-26 18:22:31 +0000150
151 return (EXECUTION_FAILURE);
152 }
153
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000154 argv = make_builtin_argv (list, &argc);
Jari Aalto726f6381996-08-26 18:22:31 +0000155 result = test_command (argc, argv);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000156 free ((char *)argv);
157
Jari Aalto726f6381996-08-26 18:22:31 +0000158 return (result);
159}