Importing usr.bin/env

Replaces commands/env. No Minix-specific changes needed.

Change-Id: I1aefebe360962ae52241384c54f9466253d783c6
This commit is contained in:
Thomas Cort 2013-10-18 09:06:27 -04:00
parent 92b8e9ac1a
commit ba6640c5fd
10 changed files with 231 additions and 191 deletions

View File

@ -8,7 +8,7 @@ SUBDIR= add_route arp ash at backup btrace \
comm compress cp crc cron crontab \
dd decomp16 DESCRIBE devmand devsize df dhcpd \
dhrystone diff diskctl dumpcore \
eject env factor fbdctl \
eject factor fbdctl \
find fix fold format fortune fsck.mfs \
gcore gcov-pull getty grep hexdump host \
hostaddr id ifconfig ifdef \

View File

@ -1,4 +0,0 @@
PROG= env
MAN=
.include <bsd.prog.mk>

83
commands/env/env.c vendored
View File

@ -1,83 +0,0 @@
/* env 1.1 - Set environment for command Author: Kees J. Bot
* 17 Dec 1997
*/
#define nil 0
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char **argv)
{
int i;
int iflag= 0;
int aflag= 0;
extern char **environ;
i= 1;
while (i < argc && argv[i][0] == '-') {
char *opt= argv[i++] + 1;
if (opt[0] == '-' && opt[1] == 0) break; /* -- */
if (opt[0] == 0) iflag= 1; /* - */
while (*opt != 0) switch (*opt++) {
case 'i':
iflag= 1; /* Clear environment. */
break;
case 'a': /* Specify arg 0 separately. */
aflag= 1;
break;
default:
fprintf(stderr,
"Usage: env [-ia] [name=value] ... [utility [argument ...]]\n");
exit(1);
}
}
/* Clear the environment if -i. */
if (iflag) *environ= nil;
/* Set the new environment strings. */
while (i < argc && strchr(argv[i], '=') != nil) {
if (putenv(argv[i]) != 0) {
fprintf(stderr, "env: Setting '%s' failed: %s\n",
argv[i], strerror(errno));
exit(1);
}
i++;
}
/* Environment settings and command may be separated with '--'.
* This is for compatibility with other envs, we don't advertise it.
*/
if (i < argc && strcmp(argv[i], "--") == 0) i++;
if (i >= argc) {
/* No utility given; print environment. */
char **ep;
for (ep= environ; *ep != nil; ep++) {
if (puts(*ep) == EOF) {
fprintf(stderr, "env: %s\n", strerror(errno));
exit(1);
}
}
return 0;
} else {
char *util, **args;
int err;
util= argv[i];
args= argv + i;
if (aflag) args++;
(void) execvp(util, args);
err= errno;
fprintf(stderr, "env: Can't execute %s: %s\n",
util, strerror(err));
return err == ENOENT ? 127 : 126;
}
}

View File

@ -4,7 +4,7 @@ MAN= ash.1 at.1 \
cp.1 crc.1 crontab.1 dd.1 \
df.1 dhrystone.1 dosdir.1 dosread.1 doswrite.1 \
dumpcore.1 eject.1 \
env.1 factor.1 \
factor.1 \
flexdoc.1 fold.1 format.1 fortune.1 \
fsck.mfs.1 host.1 hostaddr.1 ifdef.1 \
isodir.1 isoinfo.1 isoread.1 \

View File

@ -1,101 +0,0 @@
.TH ENV 1
.SH NAME
env \- set environment for command
.SH SYNOPSIS
.B env
.RB [ \-ia ]
.RI [ name\fB=\fIvalue "] ..."
.RI [ utility
.RI [ argument "...]]"
.B printenv
.RB [ \-ia ]
.RI [ name\fB=\fIvalue "] ..."
.RI [ utility
.RI [ argument "...]]"
.SH DESCRIPTION
.B Env
modifies its environment according to the
.IB name = value
arguments, and executes
.I utility
with the given arguments and the modified environment.
.PP
If no utility is specified then the modified environment is printed as
.IB name = value
strings, one per line.
.PP
.B printenv
is identical to env in every way and is included for backward compatibility
.SH OPTIONS
.TP
.B \-i
Use exactly the environment specified by the arguments; the inherited
environment is ignored.
.TP
.B \-a
Specify all arguments for the utility, i.e. the first of the arguments is
used as
.BR "argv[0]" ,
the program name. Normally the program name is
.I utility
itself.
.SH ENVIRONMENT
.TP 8n
.B PATH
The path used to find utility. It is as modified by
.BR env ,
i.e.
.B not
the inherited
.BR PATH .
.SH "SEE ALSO"
.BR sh (1),
.BR execvp (3),
.BR environ (5).
.SH DIAGNOSTICS
The return code is
.B 0
after successfully printing the environment,
.B 1
on an error within
.BR env ,
.B 126
if the
.I utility
could not be executed, or
.B 127
if
.I utility
could not be found. Appropriate diagnostic messages are printed on standard
error.
If
.I utility
can be executed then it replaces
.BR env ,
so the return code is then the return code of
.IR utility .
.SH NOTES
When run from the standard shell
.B env
is only useful with options or without arguments. Otherwise the shell can
do exactly what
.B env
can do, simply omit the word "env" on the command line.
.PP
One interesting use of
.B env
is with #! on the first line of a script to forge a PATH search for an
interpreter. For example:
.PP
.RS
#!/usr/bin/env perl
.RE
.PP
This will find the Perl interpreter if it is within the user's PATH. Most
UNIX-like systems have
.B env
in /usr/bin, but
.B perl
may be anywhere.
.SH AUTHOR
Kees J. Bot <kjb@cs.vu.nl>

View File

@ -158,6 +158,7 @@
2012/10/17 12:00:00,usr.bin/dirname
2011/09/01 13:37:33,usr.bin/du
2012/10/17 12:00:00,usr.bin/expand
2013/10/17 12:00:00,usr.bin/env
2013/05/31 12:00:00,usr.bin/finger
2013/03/22 12:00:00,usr.bin/from
2013/04/05 12:00:00,usr.bin/ftp

View File

@ -9,7 +9,7 @@ SUBDIR= \
cal chpass cksum \
col column ctags cut \
dirname du \
expand \
env expand \
finger from \
ftp genassym getopt \
head indent infocmp join \

6
usr.bin/env/Makefile vendored Normal file
View File

@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.4 1995/09/28 07:34:35 perry Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= env
.include <bsd.prog.mk>

122
usr.bin/env/env.1 vendored Normal file
View File

@ -0,0 +1,122 @@
.\" $NetBSD: env.1,v 1.12 2007/06/08 18:20:42 wiz Exp $
.\"
.\" Copyright (c) 1980, 1990 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.
.\"
.\" from: @(#)printenv.1 6.7 (Berkeley) 7/28/91
.\" $NetBSD: env.1,v 1.12 2007/06/08 18:20:42 wiz Exp $
.\"
.Dd June 8, 2007
.Dt ENV 1
.Os
.Sh NAME
.Nm env
.Nd set and print environment
.Sh SYNOPSIS
.Nm
.Op Fl i
.Op Ar name=value ...
.Oo
.Ar utility
.Op argument ...
.Oc
.Sh DESCRIPTION
.Nm
executes
.Ar utility
after modifying the environment as
specified on the command line.
The option
.Ar name=value
specifies
an environmental variable,
.Ar name ,
with a value of
.Ar value .
The option
.Sq Fl i
causes
.Nm
to completely ignore the environment
it inherits.
.Pp
If no
.Ar utility
is specified,
.Nm
prints out the names and values
of the variables in the environment, with one
.Ar name=value
pair per line.
.Sh EXIT STATUS
.Nm
exits with one of the following values:
.Bl -tag -width Ds
.It 0
.Ar utility
was invoked and completed successfully.
In this case the exit code is returned by the utility itself, not
.Nm .
If no utility was specified, then
.Nm
completed successfully and returned the exit code itself.
.It 1
An invalid command line option was passed to
.Nm .
.It 1\-125
.Ar utility
was invoked, but failed in some way;
see its manual page for more information.
In this case the exit code is returned by the utility itself, not
.Nm .
.It 126
.Ar utility
was found, but could not be invoked.
.It 127
.Ar utility
could not be found.
.El
.Sh COMPATIBILITY
The historic
.Fl
option has been deprecated but is still supported in this implementation.
.Sh SEE ALSO
.Xr execvp 3 ,
.Xr environ 7
.Sh STANDARDS
The
.Nm
utility conforms to
.St -p1003.2-92 .
.Sh BUGS
.Nm
doesn't handle commands with equal
.Pq Dq =
signs in their
names, for obvious reasons.

99
usr.bin/env/env.c vendored Normal file
View File

@ -0,0 +1,99 @@
/*
* Copyright (c) 1988, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* 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.
*/
#include <sys/cdefs.h>
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
/*static char sccsid[] = "@(#)env.c 8.3 (Berkeley) 4/2/94";*/
__RCSID("$NetBSD: env.c,v 1.20 2010/11/16 02:53:49 christos Exp $");
#endif /* not lint */
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#include <errno.h>
static void usage(void) __attribute__((__noreturn__));
extern char **environ;
int
main(int argc, char **argv)
{
char **ep;
char *cleanenv[1];
int ch;
setprogname(*argv);
(void)setlocale(LC_ALL, "");
while ((ch = getopt(argc, argv, "-i")) != -1)
switch((char)ch) {
case '-': /* obsolete */
case 'i':
environ = cleanenv;
cleanenv[0] = NULL;
break;
case '?':
default:
usage();
}
for (argv += optind; *argv && strchr(*argv, '=') != NULL; ++argv)
(void)putenv(*argv);
if (*argv) {
/* return 127 if the command to be run could not be found; 126
if the command was found but could not be invoked */
(void)execvp(*argv, argv);
err((errno == ENOENT) ? 127 : 126, "%s", *argv);
/* NOTREACHED */
}
for (ep = environ; *ep; ep++)
(void)printf("%s\n", *ep);
exit(0);
}
static void
usage(void)
{
(void)fprintf(stderr, "Usage: %s [-i] [name=value ...] [command]\n",
getprogname());
exit(1);
}