19ddb49cbSWarner Losh.\"- 24b88c807SRodney W. Grimes.\" Copyright (c) 1991, 1993 34b88c807SRodney W. Grimes.\" The Regents of the University of California. All rights reserved. 44b88c807SRodney W. Grimes.\" 54b88c807SRodney W. Grimes.\" This code is derived from software contributed to Berkeley by 64b88c807SRodney W. Grimes.\" the Institute of Electrical and Electronics Engineers, Inc. 74b88c807SRodney W. Grimes.\" 84b88c807SRodney W. Grimes.\" Redistribution and use in source and binary forms, with or without 94b88c807SRodney W. Grimes.\" modification, are permitted provided that the following conditions 104b88c807SRodney W. Grimes.\" are met: 114b88c807SRodney W. Grimes.\" 1. Redistributions of source code must retain the above copyright 124b88c807SRodney W. Grimes.\" notice, this list of conditions and the following disclaimer. 134b88c807SRodney W. Grimes.\" 2. Redistributions in binary form must reproduce the above copyright 144b88c807SRodney W. Grimes.\" notice, this list of conditions and the following disclaimer in the 154b88c807SRodney W. Grimes.\" documentation and/or other materials provided with the distribution. 16*fbbd9655SWarner Losh.\" 3. Neither the name of the University nor the names of its contributors 174b88c807SRodney W. Grimes.\" may be used to endorse or promote products derived from this software 184b88c807SRodney W. Grimes.\" without specific prior written permission. 194b88c807SRodney W. Grimes.\" 204b88c807SRodney W. Grimes.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 214b88c807SRodney W. Grimes.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 224b88c807SRodney W. Grimes.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 234b88c807SRodney W. Grimes.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 244b88c807SRodney W. Grimes.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 254b88c807SRodney W. Grimes.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 264b88c807SRodney W. Grimes.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 274b88c807SRodney W. Grimes.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 284b88c807SRodney W. Grimes.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 294b88c807SRodney W. Grimes.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 304b88c807SRodney W. Grimes.\" SUCH DAMAGE. 314b88c807SRodney W. Grimes.\" 322bb154d9SSevan Janiyan.Dd October 5, 2016 334b88c807SRodney W. Grimes.Dt TEST 1 344b88c807SRodney W. Grimes.Os 354b88c807SRodney W. Grimes.Sh NAME 36717a08b6SSheldon Hearn.Nm test , 37717a08b6SSheldon Hearn.Nm \&[ 384b88c807SRodney W. Grimes.Nd condition evaluation utility 394b88c807SRodney W. Grimes.Sh SYNOPSIS 40be8b1497SRuslan Ermilov.Nm 414b88c807SRodney W. Grimes.Ar expression 42238fe5f7SRuslan Ermilov.Nm \&[ 4335471bf8SJoel Dahl.Ar expression Cm \&] 444b88c807SRodney W. Grimes.Sh DESCRIPTION 454b88c807SRodney W. GrimesThe 46be8b1497SRuslan Ermilov.Nm 474b88c807SRodney W. Grimesutility evaluates the expression and, if it evaluates 484b88c807SRodney W. Grimesto true, returns a zero (true) exit status; otherwise 494b88c807SRodney W. Grimesit returns 1 (false). 507eb5016aSRuslan ErmilovIf there is no expression, 517eb5016aSRuslan Ermilov.Nm 527eb5016aSRuslan Ermilovalso 534b88c807SRodney W. Grimesreturns 1 (false). 544b88c807SRodney W. Grimes.Pp 554b88c807SRodney W. GrimesAll operators and flags are separate arguments to the 56be8b1497SRuslan Ermilov.Nm 574b88c807SRodney W. Grimesutility. 584b88c807SRodney W. Grimes.Pp 594b88c807SRodney W. GrimesThe following primaries are used to construct expression: 60717a08b6SSheldon Hearn.Bl -tag -width Ar 614b88c807SRodney W. Grimes.It Fl b Ar file 624b88c807SRodney W. GrimesTrue if 634b88c807SRodney W. Grimes.Ar file 644b88c807SRodney W. Grimesexists and is a block special 654b88c807SRodney W. Grimesfile. 664b88c807SRodney W. Grimes.It Fl c Ar file 674b88c807SRodney W. GrimesTrue if 684b88c807SRodney W. Grimes.Ar file 694b88c807SRodney W. Grimesexists and is a character 704b88c807SRodney W. Grimesspecial file. 714b88c807SRodney W. Grimes.It Fl d Ar file 724b88c807SRodney W. GrimesTrue if 734b88c807SRodney W. Grimes.Ar file 744b88c807SRodney W. Grimesexists and is a directory. 754b88c807SRodney W. Grimes.It Fl e Ar file 764b88c807SRodney W. GrimesTrue if 774b88c807SRodney W. Grimes.Ar file 784b88c807SRodney W. Grimesexists (regardless of type). 794b88c807SRodney W. Grimes.It Fl f Ar file 804b88c807SRodney W. GrimesTrue if 814b88c807SRodney W. Grimes.Ar file 824b88c807SRodney W. Grimesexists and is a regular file. 834b88c807SRodney W. Grimes.It Fl g Ar file 844b88c807SRodney W. GrimesTrue if 854b88c807SRodney W. Grimes.Ar file 864b88c807SRodney W. Grimesexists and its set group ID flag 874b88c807SRodney W. Grimesis set. 884b88c807SRodney W. Grimes.It Fl h Ar file 894b88c807SRodney W. GrimesTrue if 904b88c807SRodney W. Grimes.Ar file 914b88c807SRodney W. Grimesexists and is a symbolic link. 92717a08b6SSheldon HearnThis operator is retained for compatibility with previous versions of 93bef84d6bSSheldon Hearnthis program. 94bef84d6bSSheldon HearnDo not rely on its existence; use 95717a08b6SSheldon Hearn.Fl L 96717a08b6SSheldon Hearninstead. 97717a08b6SSheldon Hearn.It Fl k Ar file 98717a08b6SSheldon HearnTrue if 99717a08b6SSheldon Hearn.Ar file 100717a08b6SSheldon Hearnexists and its sticky bit is set. 1014b88c807SRodney W. Grimes.It Fl n Ar string 1024b88c807SRodney W. GrimesTrue if the length of 1034b88c807SRodney W. Grimes.Ar string 1044b88c807SRodney W. Grimesis nonzero. 1054b88c807SRodney W. Grimes.It Fl p Ar file 1064b88c807SRodney W. GrimesTrue if 1074b88c807SRodney W. Grimes.Ar file 1084b88c807SRodney W. Grimesis a named pipe 109c4d9468eSRuslan Ermilov.Pq Tn FIFO . 1104b88c807SRodney W. Grimes.It Fl r Ar file 1114b88c807SRodney W. GrimesTrue if 112c263cc21SPhilippe Charnier.Ar file 113c263cc21SPhilippe Charnierexists and is readable. 1144b88c807SRodney W. Grimes.It Fl s Ar file 1154b88c807SRodney W. GrimesTrue if 1164b88c807SRodney W. Grimes.Ar file 1174b88c807SRodney W. Grimesexists and has a size greater 1184b88c807SRodney W. Grimesthan zero. 11946c128b5SDima Dorfman.It Fl t Ar file_descriptor 1204b88c807SRodney W. GrimesTrue if the file whose file descriptor number 1214b88c807SRodney W. Grimesis 1224b88c807SRodney W. Grimes.Ar file_descriptor 123717a08b6SSheldon Hearnis open and is associated with a terminal. 1244b88c807SRodney W. Grimes.It Fl u Ar file 1254b88c807SRodney W. GrimesTrue if 1264b88c807SRodney W. Grimes.Ar file 1274b88c807SRodney W. Grimesexists and its set user ID flag 1284b88c807SRodney W. Grimesis set. 1294b88c807SRodney W. Grimes.It Fl w Ar file 1304b88c807SRodney W. GrimesTrue if 1314b88c807SRodney W. Grimes.Ar file 1324b88c807SRodney W. Grimesexists and is writable. 1334b88c807SRodney W. GrimesTrue 1344b88c807SRodney W. Grimesindicates only that the write flag is on. 1354b88c807SRodney W. GrimesThe file is not writable on a read-only file 1364b88c807SRodney W. Grimessystem even if this test indicates true. 1374b88c807SRodney W. Grimes.It Fl x Ar file 1384b88c807SRodney W. GrimesTrue if 1394b88c807SRodney W. Grimes.Ar file 1404b88c807SRodney W. Grimesexists and is executable. 1414b88c807SRodney W. GrimesTrue 1424b88c807SRodney W. Grimesindicates only that the execute flag is on. 1434b88c807SRodney W. GrimesIf 1444b88c807SRodney W. Grimes.Ar file 1454b88c807SRodney W. Grimesis a directory, true indicates that 1464b88c807SRodney W. Grimes.Ar file 1474b88c807SRodney W. Grimescan be searched. 1484b88c807SRodney W. Grimes.It Fl z Ar string 1494b88c807SRodney W. GrimesTrue if the length of 1504b88c807SRodney W. Grimes.Ar string 1514b88c807SRodney W. Grimesis zero. 152717a08b6SSheldon Hearn.It Fl L Ar file 153717a08b6SSheldon HearnTrue if 154717a08b6SSheldon Hearn.Ar file 155717a08b6SSheldon Hearnexists and is a symbolic link. 156717a08b6SSheldon Hearn.It Fl O Ar file 157717a08b6SSheldon HearnTrue if 158717a08b6SSheldon Hearn.Ar file 159717a08b6SSheldon Hearnexists and its owner matches the effective user id of this process. 160717a08b6SSheldon Hearn.It Fl G Ar file 161717a08b6SSheldon HearnTrue if 162717a08b6SSheldon Hearn.Ar file 163717a08b6SSheldon Hearnexists and its group matches the effective group id of this process. 164717a08b6SSheldon Hearn.It Fl S Ar file 165717a08b6SSheldon HearnTrue if 166717a08b6SSheldon Hearn.Ar file 167717a08b6SSheldon Hearnexists and is a socket. 168717a08b6SSheldon Hearn.It Ar file1 Fl nt Ar file2 169f19825afSJilles TjoelkerTrue if 170717a08b6SSheldon Hearn.Ar file1 171f19825afSJilles Tjoelkerexists and is newer than 172717a08b6SSheldon Hearn.Ar file2 . 173717a08b6SSheldon Hearn.It Ar file1 Fl ot Ar file2 174f19825afSJilles TjoelkerTrue if 175717a08b6SSheldon Hearn.Ar file1 176f19825afSJilles Tjoelkerexists and is older than 177717a08b6SSheldon Hearn.Ar file2 . 178717a08b6SSheldon Hearn.It Ar file1 Fl ef Ar file2 179717a08b6SSheldon HearnTrue if 180717a08b6SSheldon Hearn.Ar file1 181717a08b6SSheldon Hearnand 182717a08b6SSheldon Hearn.Ar file2 183717a08b6SSheldon Hearnexist and refer to the same file. 1844b88c807SRodney W. Grimes.It Ar string 1854b88c807SRodney W. GrimesTrue if 1864b88c807SRodney W. Grimes.Ar string 1874b88c807SRodney W. Grimesis not the null 1884b88c807SRodney W. Grimesstring. 1897eb5016aSRuslan Ermilov.It Ar s1 Cm = Ar s2 1904b88c807SRodney W. GrimesTrue if the strings 1917eb5016aSRuslan Ermilov.Ar s1 1924b88c807SRodney W. Grimesand 1937eb5016aSRuslan Ermilov.Ar s2 1944b88c807SRodney W. Grimesare identical. 1957eb5016aSRuslan Ermilov.It Ar s1 Cm != Ar s2 1964b88c807SRodney W. GrimesTrue if the strings 1977eb5016aSRuslan Ermilov.Ar s1 1984b88c807SRodney W. Grimesand 1997eb5016aSRuslan Ermilov.Ar s2 2004b88c807SRodney W. Grimesare not identical. 2017eb5016aSRuslan Ermilov.It Ar s1 Cm < Ar s2 202717a08b6SSheldon HearnTrue if string 2037eb5016aSRuslan Ermilov.Ar s1 204717a08b6SSheldon Hearncomes before 2057eb5016aSRuslan Ermilov.Ar s2 206ee70653eSTim J. Robbinsbased on the binary value of their characters. 2077eb5016aSRuslan Ermilov.It Ar s1 Cm > Ar s2 208717a08b6SSheldon HearnTrue if string 2097eb5016aSRuslan Ermilov.Ar s1 210717a08b6SSheldon Hearncomes after 2117eb5016aSRuslan Ermilov.Ar s2 212ee70653eSTim J. Robbinsbased on the binary value of their characters. 2137eb5016aSRuslan Ermilov.It Ar n1 Fl eq Ar n2 2144b88c807SRodney W. GrimesTrue if the integers 2157eb5016aSRuslan Ermilov.Ar n1 2164b88c807SRodney W. Grimesand 2177eb5016aSRuslan Ermilov.Ar n2 2184b88c807SRodney W. Grimesare algebraically 2194b88c807SRodney W. Grimesequal. 2207eb5016aSRuslan Ermilov.It Ar n1 Fl ne Ar n2 2214b88c807SRodney W. GrimesTrue if the integers 2227eb5016aSRuslan Ermilov.Ar n1 2234b88c807SRodney W. Grimesand 2247eb5016aSRuslan Ermilov.Ar n2 2254b88c807SRodney W. Grimesare not 2264b88c807SRodney W. Grimesalgebraically equal. 2277eb5016aSRuslan Ermilov.It Ar n1 Fl gt Ar n2 2284b88c807SRodney W. GrimesTrue if the integer 2297eb5016aSRuslan Ermilov.Ar n1 2304b88c807SRodney W. Grimesis algebraically 2314b88c807SRodney W. Grimesgreater than the integer 2327eb5016aSRuslan Ermilov.Ar n2 . 2337eb5016aSRuslan Ermilov.It Ar n1 Fl ge Ar n2 2344b88c807SRodney W. GrimesTrue if the integer 2357eb5016aSRuslan Ermilov.Ar n1 2364b88c807SRodney W. Grimesis algebraically 2374b88c807SRodney W. Grimesgreater than or equal to the integer 2387eb5016aSRuslan Ermilov.Ar n2 . 2397eb5016aSRuslan Ermilov.It Ar n1 Fl lt Ar n2 2404b88c807SRodney W. GrimesTrue if the integer 2417eb5016aSRuslan Ermilov.Ar n1 2424b88c807SRodney W. Grimesis algebraically less 2434b88c807SRodney W. Grimesthan the integer 2447eb5016aSRuslan Ermilov.Ar n2 . 2457eb5016aSRuslan Ermilov.It Ar n1 Fl le Ar n2 2464b88c807SRodney W. GrimesTrue if the integer 2477eb5016aSRuslan Ermilov.Ar n1 2484b88c807SRodney W. Grimesis algebraically less 2494b88c807SRodney W. Grimesthan or equal to the integer 2507eb5016aSRuslan Ermilov.Ar n2 . 2514b88c807SRodney W. Grimes.El 2524b88c807SRodney W. Grimes.Pp 253593cc6f3SYaroslav TykhiyIf 254593cc6f3SYaroslav Tykhiy.Ar file 255593cc6f3SYaroslav Tykhiyis a symbolic link, 256593cc6f3SYaroslav Tykhiy.Nm 257593cc6f3SYaroslav Tykhiywill fully dereference it and then evaluate the expression 258593cc6f3SYaroslav Tykhiyagainst the file referenced, except for the 259593cc6f3SYaroslav Tykhiy.Fl h 260593cc6f3SYaroslav Tykhiyand 261593cc6f3SYaroslav Tykhiy.Fl L 262593cc6f3SYaroslav Tykhiyprimaries. 263593cc6f3SYaroslav Tykhiy.Pp 2644b88c807SRodney W. GrimesThese primaries can be combined with the following operators: 2654b88c807SRodney W. Grimes.Bl -tag -width Ar 2664b88c807SRodney W. Grimes.It Cm \&! Ar expression 2674b88c807SRodney W. GrimesTrue if 2684b88c807SRodney W. Grimes.Ar expression 2694b88c807SRodney W. Grimesis false. 2704b88c807SRodney W. Grimes.It Ar expression1 Fl a Ar expression2 2714b88c807SRodney W. GrimesTrue if both 2724b88c807SRodney W. Grimes.Ar expression1 2734b88c807SRodney W. Grimesand 2744b88c807SRodney W. Grimes.Ar expression2 2754b88c807SRodney W. Grimesare true. 2764b88c807SRodney W. Grimes.It Ar expression1 Fl o Ar expression2 2774b88c807SRodney W. GrimesTrue if either 2784b88c807SRodney W. Grimes.Ar expression1 2794b88c807SRodney W. Grimesor 2804b88c807SRodney W. Grimes.Ar expression2 2814b88c807SRodney W. Grimesare true. 282c68e12a6SJilles Tjoelker.It Cm \&( Ar expression Cm \&) 2834b88c807SRodney W. GrimesTrue if expression is true. 2844b88c807SRodney W. Grimes.El 2854b88c807SRodney W. Grimes.Pp 2864b88c807SRodney W. GrimesThe 2874b88c807SRodney W. Grimes.Fl a 2884b88c807SRodney W. Grimesoperator has higher precedence than the 2894b88c807SRodney W. Grimes.Fl o 2904b88c807SRodney W. Grimesoperator. 291d90c5c4aSAkinori MUSHA.Pp 292d90c5c4aSAkinori MUSHASome shells may provide a builtin 293d90c5c4aSAkinori MUSHA.Nm 294d90c5c4aSAkinori MUSHAcommand which is similar or identical to this utility. 295d90c5c4aSAkinori MUSHAConsult the 296d90c5c4aSAkinori MUSHA.Xr builtin 1 297d90c5c4aSAkinori MUSHAmanual page. 2984b88c807SRodney W. Grimes.Sh GRAMMAR AMBIGUITY 2994b88c807SRodney W. GrimesThe 300be8b1497SRuslan Ermilov.Nm 301eccea571SRuslan Ermilovgrammar is inherently ambiguous. 3025512804bSRebecca CranIn order to assure a degree of consistency, 3034b88c807SRodney W. Grimesthe cases described in the 3044b88c807SRodney W. Grimes.St -p1003.2 , 3054b88c807SRodney W. Grimessection D11.2/4.62.4, standard 3064b88c807SRodney W. Grimesare evaluated consistently according to the rules specified in the 307eccea571SRuslan Ermilovstandards document. 308eccea571SRuslan ErmilovAll other cases are subject to the ambiguity in the 3094b88c807SRodney W. Grimescommand semantics. 3102f67f12eSJilles Tjoelker.Pp 3112f67f12eSJilles TjoelkerIn particular, only expressions containing 3122f67f12eSJilles Tjoelker.Fl a , 3132f67f12eSJilles Tjoelker.Fl o , 3142f67f12eSJilles Tjoelker.Cm \&( 3152f67f12eSJilles Tjoelkeror 3162f67f12eSJilles Tjoelker.Cm \&) 3172f67f12eSJilles Tjoelkercan be ambiguous. 3188465a404SDaniel Gerzo.Sh EXIT STATUS 3194b88c807SRodney W. GrimesThe 320be8b1497SRuslan Ermilov.Nm 3214b88c807SRodney W. Grimesutility exits with one of the following values: 3227eb5016aSRuslan Ermilov.Bl -tag -width indent 3234b88c807SRodney W. Grimes.It 0 3244b88c807SRodney W. Grimesexpression evaluated to true. 3254b88c807SRodney W. Grimes.It 1 3264b88c807SRodney W. Grimesexpression evaluated to false or expression was 3274b88c807SRodney W. Grimesmissing. 3284b88c807SRodney W. Grimes.It >1 3294b88c807SRodney W. GrimesAn error occurred. 3304b88c807SRodney W. Grimes.El 331a5efad6fSJilles Tjoelker.Sh EXAMPLES 332a5efad6fSJilles TjoelkerImplement 333a5efad6fSJilles Tjoelker.Li test FILE1 -nt FILE2 334a5efad6fSJilles Tjoelkerusing only 335a5efad6fSJilles Tjoelker.Tn POSIX 336a5efad6fSJilles Tjoelkerfunctionality: 337a5efad6fSJilles Tjoelker.Pp 338a5efad6fSJilles Tjoelker.Dl test -n \&"$(find -L -- FILE1 -prune -newer FILE2 2>/dev/null)\&" 339a5efad6fSJilles Tjoelker.Pp 340a5efad6fSJilles TjoelkerThis can be modified using non-standard 341a5efad6fSJilles Tjoelker.Xr find 1 342a5efad6fSJilles Tjoelkerprimaries like 343a5efad6fSJilles Tjoelker.Cm -newerca 344a5efad6fSJilles Tjoelkerto compare other timestamps. 345a68c6b57SJilles Tjoelker.Sh COMPATIBILITY 346a68c6b57SJilles TjoelkerFor compatibility with some other implementations, 347a68c6b57SJilles Tjoelkerthe 348a68c6b57SJilles Tjoelker.Cm = 349a68c6b57SJilles Tjoelkerprimary can be substituted with 350a68c6b57SJilles Tjoelker.Cm == 351a68c6b57SJilles Tjoelkerwith the same meaning. 352e5bf7bf4SJoseph Koshy.Sh SEE ALSO 353d90c5c4aSAkinori MUSHA.Xr builtin 1 , 354e5bf7bf4SJoseph Koshy.Xr expr 1 , 355a5efad6fSJilles Tjoelker.Xr find 1 , 356593cc6f3SYaroslav Tykhiy.Xr sh 1 , 357a5efad6fSJilles Tjoelker.Xr stat 1 , 358593cc6f3SYaroslav Tykhiy.Xr symlink 7 3594b88c807SRodney W. Grimes.Sh STANDARDS 3604b88c807SRodney W. GrimesThe 361be8b1497SRuslan Ermilov.Nm 362717a08b6SSheldon Hearnutility implements a superset of the 3634b88c807SRodney W. Grimes.St -p1003.2 364717a08b6SSheldon Hearnspecification. 36528bb6b49SJilles TjoelkerThe primaries 36628bb6b49SJilles Tjoelker.Cm < , 36728bb6b49SJilles Tjoelker.Cm == , 36828bb6b49SJilles Tjoelker.Cm > , 36928bb6b49SJilles Tjoelker.Fl ef , 37028bb6b49SJilles Tjoelker.Fl nt , 37128bb6b49SJilles Tjoelker.Fl ot , 37228bb6b49SJilles Tjoelker.Fl G , 37328bb6b49SJilles Tjoelkerand 37428bb6b49SJilles Tjoelker.Fl O 37528bb6b49SJilles Tjoelkerare extensions. 3762bb154d9SSevan Janiyan.Sh HISTORY 3772bb154d9SSevan JaniyanA 3782bb154d9SSevan Janiyan.Nm 3792bb154d9SSevan Janiyanutility appeared in 3802bb154d9SSevan Janiyan.At v7 . 381ec45d514SYaroslav Tykhiy.Sh BUGS 382ec45d514SYaroslav TykhiyBoth sides are always evaluated in 383ec45d514SYaroslav Tykhiy.Fl a 384ec45d514SYaroslav Tykhiyand 3852f67f12eSJilles Tjoelker.Fl o . 3866a215886SYaroslav TykhiyFor instance, the writable status of 3876a215886SYaroslav Tykhiy.Pa file 3886a215886SYaroslav Tykhiywill be tested by the following command even though the former expression 3896a215886SYaroslav Tykhiyindicated false, which results in a gratuitous access to the file system: 3906a215886SYaroslav Tykhiy.Dl "[ -z abc -a -w file ]" 3912f67f12eSJilles TjoelkerTo avoid this, write 3922f67f12eSJilles Tjoelker.Dl "[ -z abc ] && [ -w file ]" 393