xref: /freebsd/usr.bin/env/env.1 (revision 5c52a79884070364bfc920fb8e492cfac61ec72f)
1.\" Copyright (c) 1980, 1990, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" This code is derived from software contributed to Berkeley by
5.\" the Institute of Electrical and Electronics Engineers, Inc.
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\" 3. All advertising materials mentioning features or use of this software
15.\"    must display the following acknowledgement:
16.\"	This product includes software developed by the University of
17.\"	California, Berkeley and its contributors.
18.\" 4. Neither the name of the University nor the names of its contributors
19.\"    may be used to endorse or promote products derived from this software
20.\"    without specific prior written permission.
21.\"
22.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32.\" SUCH DAMAGE.
33.\"
34.\" From @(#)printenv.1	8.1 (Berkeley) 6/6/93
35.\" From FreeBSD: src/usr.bin/printenv/printenv.1,v 1.17 2002/11/26 17:33:35 ru Exp
36.\" $FreeBSD$
37.\"
38.Dd April 17, 2008
39.Dt ENV 1
40.Os
41.Sh NAME
42.Nm env
43.Nd set environment and execute command, or print environment
44.Sh SYNOPSIS
45.Nm
46.Op Fl iv
47.Op Fl P Ar altpath
48.Op Fl S Ar string
49.Op Fl u Ar name
50.Op Ar name Ns = Ns Ar value ...
51.Op Ar utility Op Ar argument ...
52.Sh DESCRIPTION
53The
54.Nm
55utility executes another
56.Ar utility
57after modifying the environment as
58specified on the command line.
59Each
60.Ar name Ns = Ns Ar value
61option specifies the setting of an environment variable,
62.Ar name ,
63with a value of
64.Ar value .
65All such environment variables are set before the
66.Ar utility
67is executed.
68.Pp
69The options are as follows:
70.Bl -tag -width indent
71.It Fl i
72Execute the
73.Ar utility
74with only those environment variables specified by
75.Ar name Ns = Ns Ar value
76options.
77The environment inherited
78by
79.Nm
80is ignored completely.
81.\"	-P
82.It Fl P Ar altpath
83Search the set of directories as specified by
84.Ar altpath
85to locate the specified
86.Ar utility
87program, instead of using the value of the
88.Ev PATH
89environment variable.
90.\"	-S
91.It Fl S Ar string
92Split apart the given
93.Ar string
94into multiple strings, and process each of the resulting strings
95as separate arguments to the
96.Nm
97utility.
98The
99.Fl S
100option recognizes some special character escape sequences and
101also supports environment-variable substitution, as described
102below.
103.\"	-u
104.It Fl u Ar name
105If the environment variable
106.Ar name
107is in the environment, then remove it before processing the
108remaining options.
109This is similar to the
110.Ic unset
111command in
112.Xr sh 1 .
113The value for
114.Ar name
115must not include the
116.Ql =
117character.
118.\"	-v
119.It Fl v
120Print verbose information for each step of processing done by the
121.Nm
122utility.
123Additional information will be printed if
124.Fl v
125is specified multiple times.
126.El
127.Pp
128The above options are only recognized when they are specified
129before any
130.Ar name Ns = Ns Ar value
131options.
132.Pp
133If no
134.Ar utility
135is specified,
136.Nm
137prints out the names and values
138of the variables in the environment, with one name/value pair per line.
139.\"
140.Ss Details of Fl S Ss (split-string) processing
141The processing of the
142.Fl S
143option will split the given
144.Ar string
145into separate arguments based on any space or <tab> characters found in the
146.Ar string .
147Each of those new arguments will then be treated as if it had been
148specified as a separate argument on the original
149.Nm
150command.
151.Pp
152Spaces and tabs may be embedded in one of those new arguments by using
153single
154.Pq Dq Li '
155or double
156.Pq Ql \&"
157quotes, or backslashes
158.Pq Ql \e .
159Single quotes will escape all non-single quote characters, up to
160the matching single quote.
161Double quotes will escape all non-double quote characters, up to
162the matching double quote.
163It is an error if the end of the
164.Ar string
165is reached before the matching quote character.
166.Pp
167If
168.Fl S
169would create a new argument that starts with the
170.Ql #
171character, then that argument and the remainder of the
172.Ar string
173will be ignored.
174The
175.Ql \e#
176sequence can be used when you want a new argument to start
177with a
178.Ql #
179character, without causing the remainder of the
180.Ar string
181to be skipped.
182.Pp
183While processing the
184.Ar string
185value,
186.Fl S
187processing will treat certain character combinations as escape
188sequences which represent some action to take.
189The character escape sequences are in backslash notation.
190The characters and their meanings are as follows:
191.Pp
192.Bl -tag -width indent -offset indent -compact
193.It Cm \ec
194Ignore the remaining characters in the
195.Ar string .
196This must not appear inside a double-quoted string.
197.It Cm \ef
198Replace with a <form-feed> character.
199.It Cm \en
200Replace with a <new-line> character.
201.It Cm \er
202Replace with a <carriage return> character.
203.It Cm \et
204Replace with a <tab> character.
205.It Cm \ev
206Replace with a <vertical tab> character.
207.It Cm \e#
208Replace with a
209.Ql #
210character.
211This would be useful when you need a
212.Ql #
213as the first character in one of the arguments created
214by splitting apart the given
215.Ar string .
216.It Cm \e$
217Replace with a
218.Ql $
219character.
220.It Cm \e_
221If this is found inside of a double-quoted string, then replace it
222with a single blank.
223If this is found outside of a quoted string, then treat this as the
224separator character between new arguments in the original
225.Ar string .
226.It Cm \e"
227Replace with a <double quote> character.
228.It Cm \e\'
229Replace with a <single quote> character.
230.It Cm \e\e
231Replace with a backslash character.
232.El
233.Pp
234The sequences for <single-quote> and backslash are the only sequences
235which are recognized inside of a single-quoted string.
236The other sequences have no special meaning inside a single-quoted
237string.
238All escape sequences are recognized inside of a double-quoted string.
239It is an error if a single
240.Ql \e
241character is followed by a character other than the ones listed above.
242.Pp
243The processing of
244.Fl S
245also supports substitution of values from environment variables.
246To do this, the name of the environment variable must be inside of
247.Ql ${} ,
248such as:
249.Li ${SOMEVAR} .
250The common shell syntax of
251.Li $SOMEVAR
252is not supported.
253All values substituted will be the values of the environment variables
254as they were when the
255.Nm
256utility was originally invoked.
257Those values will not be checked for any of the escape sequences as
258described above.
259And any settings of
260.Ar name Ns = Ns Ar value
261will not effect the values used for substitution in
262.Fl S
263processing.
264.Pp
265Also,
266.Fl S
267processing can not reference the value of the special parameters
268which are defined by most shells.
269For instance,
270.Fl S
271can not recognize special parameters such as:
272.Ql $* ,
273.Ql $@ ,
274.Ql $# ,
275.Ql $?
276or
277.Ql $$
278if they appear inside the given
279.Ar string .
280.\"
281.Ss Use in shell-scripts
282The
283.Nm
284utility is often used as the
285.Ar interpreter
286on the first line of interpreted scripts, as
287described in
288.Xr execve 2 .
289.Pp
290Note that the way the kernel parses the
291.Ql #!
292(first line) of an interpreted script has changed as of
293.Fx 6.0 .
294Prior to that, the
295.Fx
296kernel would split that first line into separate arguments based
297on any whitespace (space or <tab> characters) found in the line.
298So, if a script named
299.Pa /usr/local/bin/someport
300had a first line of:
301.Pp
302.Dl "#!/usr/local/bin/php -n -q -dsafe_mode=0"
303.Pp
304then the
305.Pa /usr/local/bin/php
306program would have been started with the arguments of:
307.Bd -literal -offset indent
308arg[0] = '/usr/local/bin/php'
309arg[1] = '-n'
310arg[2] = '-q'
311arg[3] = '-dsafe_mode=0'
312arg[4] = '/usr/local/bin/someport'
313.Ed
314.Pp
315plus any arguments the user specified when executing
316.Pa someport .
317However, this processing of multiple options on the
318.Ql #!
319line is not the way any other operating system parses the
320first line of an interpreted script.
321So after a change which was made for
322.Fx 6.0
323release, that script will result in
324.Pa /usr/local/bin/php
325being started with the arguments of:
326.Bd -literal -offset indent
327arg[0] = '/usr/local/bin/php'
328arg[1] = '-n -q -dsafe_mode=0'
329arg[2] = '/usr/local/bin/someport'
330.Ed
331.Pp
332plus any arguments the user specified.
333This caused a significant change in the behavior of a few scripts.
334In the case of above script, to have it behave the same way under
335.Fx 6.0
336as it did under earlier releases, the first line should be
337changed to:
338.Pp
339.Dl "#!/usr/bin/env -S /usr/local/bin/php -n -q -dsafe_mode=0"
340.Pp
341The
342.Nm
343utility will be started with the entire line as a single
344argument:
345.Pp
346.Dl "arg[1] = '-S /usr/local/bin/php -n -q -dsafe_mode=0'"
347.Pp
348and then
349.Fl S
350processing will split that line into separate arguments before
351executing
352.Pa /usr/local/bin/php .
353.\"
354.Sh ENVIRONMENT
355The
356.Nm
357utility uses the
358.Ev PATH
359environment variable to locate the requested
360.Ar utility
361if the name contains no
362.Ql /
363characters, unless the
364.Fl P
365option has been specified.
366.Sh EXIT STATUS
367.Ex -std
368An exit status of 126 indicates that
369.Ar utility
370was found, but could not be executed.
371An exit status of 127 indicates that
372.Ar utility
373could not be found.
374.Sh EXAMPLES
375Since the
376.Nm
377utility is often used as part of the first line of an interpreted script,
378the following examples show a number of ways that the
379.Nm
380utility can be useful in scripts.
381.Pp
382The kernel processing of an interpreted script does not allow a script
383to directly reference some other script as its own interpreter.
384As a way around this, the main difference between
385.Pp
386.Dl #!/usr/local/bin/foo
387and
388.Dl "#!/usr/bin/env /usr/local/bin/foo"
389.Pp
390is that the latter works even if
391.Pa /usr/local/bin/foo
392is itself an interpreted script.
393.Pp
394Probably the most common use of
395.Nm
396is to find the correct interpreter for a script, when the interpreter
397may be in different directories on different systems.
398The following example will find the
399.Ql perl
400interpreter by searching through the directories specified by
401.Ev PATH .
402.Pp
403.Dl "#!/usr/bin/env perl"
404.Pp
405One limitation of that example is that it assumes the user's value
406for
407.Ev PATH
408is set to a value which will find the interpreter you want
409to execute.
410The
411.Fl P
412option can be used to make sure a specific list of directories is
413used in the search for
414.Ar utility .
415Note that the
416.Fl S
417option is also required for this example to work correctly.
418.Pp
419.Dl "#!/usr/bin/env -S -P/usr/local/bin:/usr/bin perl"
420.Pp
421The above finds
422.Ql perl
423only if it is in
424.Pa /usr/local/bin
425or
426.Pa /usr/bin .
427That could be combined with the present value of
428.Ev PATH ,
429to provide more flexibility.
430Note that spaces are not required between the
431.Fl S
432and
433.Fl P
434options:
435.Pp
436.Dl "#!/usr/bin/env -S-P/usr/local/bin:/usr/bin:${PATH} perl"
437.Sh COMPATIBILITY
438The
439.Nm
440utility accepts the
441.Fl
442option as a synonym for
443.Fl i .
444.Sh SEE ALSO
445.Xr printenv 1 ,
446.Xr sh 1 ,
447.Xr execvp 3 ,
448.Xr environ 7
449.Sh STANDARDS
450The
451.Nm
452utility conforms to
453.St -p1003.1-2001 .
454The
455.Fl P , S , u
456and
457.Fl v
458options are non-standard extensions supported by
459.Fx ,
460but which may not be available on other operating systems.
461.Sh HISTORY
462The
463.Nm
464command appeared in
465.Bx 4.4 .
466The
467.Fl P , S
468and
469.Fl v
470options were added in
471.Fx 6.0 .
472.Sh BUGS
473The
474.Nm
475utility does not handle values of
476.Ar utility
477which have an equals sign
478.Pq Ql =
479in their name, for obvious reasons.
480.Pp
481The
482.Nm
483utility does not take multibyte characters into account when
484processing the
485.Fl S
486option, which may lead to incorrect results in some locales.
487