diff --git a/commands/Makefile b/commands/Makefile index 9ba275a4a..062cdda9e 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -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 \ diff --git a/commands/env/Makefile b/commands/env/Makefile deleted file mode 100644 index 1e34c0798..000000000 --- a/commands/env/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PROG= env -MAN= - -.include diff --git a/commands/env/env.c b/commands/env/env.c deleted file mode 100644 index b3f9d50d0..000000000 --- a/commands/env/env.c +++ /dev/null @@ -1,83 +0,0 @@ -/* env 1.1 - Set environment for command Author: Kees J. Bot - * 17 Dec 1997 - */ -#define nil 0 -#include -#include -#include -#include -#include -#include - -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; - } -} diff --git a/man/man1/Makefile b/man/man1/Makefile index 6e2f2deb6..94222a905 100644 --- a/man/man1/Makefile +++ b/man/man1/Makefile @@ -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 \ diff --git a/man/man1/env.1 b/man/man1/env.1 deleted file mode 100644 index bcc9735c9..000000000 --- a/man/man1/env.1 +++ /dev/null @@ -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 diff --git a/releasetools/nbsd_ports b/releasetools/nbsd_ports index a73e8564b..9cbdec721 100644 --- a/releasetools/nbsd_ports +++ b/releasetools/nbsd_ports @@ -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 diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 7e60dd08a..94d944671 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -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 \ diff --git a/usr.bin/env/Makefile b/usr.bin/env/Makefile new file mode 100644 index 000000000..aef90b0f3 --- /dev/null +++ b/usr.bin/env/Makefile @@ -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 diff --git a/usr.bin/env/env.1 b/usr.bin/env/env.1 new file mode 100644 index 000000000..d4597bdb3 --- /dev/null +++ b/usr.bin/env/env.1 @@ -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. diff --git a/usr.bin/env/env.c b/usr.bin/env/env.c new file mode 100644 index 000000000..bf2430da8 --- /dev/null +++ b/usr.bin/env/env.c @@ -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 +#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 +#include +#include +#include +#include +#include +#include + +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); +}