Module Name: src Committed By: kim Date: Mon Oct 28 11:30:37 UTC 2024
Modified Files: src/usr.bin/env: env.1 env.c Log Message: Implement "env -C dir" to chdir Use err(3) to expose errno(2) if chdir(2) (or unsetenv(3)) fails. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/usr.bin/env/env.1 cvs rdiff -u -r1.23 -r1.24 src/usr.bin/env/env.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/env/env.1 diff -u src/usr.bin/env/env.1:1.15 src/usr.bin/env/env.1:1.16 --- src/usr.bin/env/env.1:1.15 Sat Feb 8 11:10:08 2020 +++ src/usr.bin/env/env.1 Mon Oct 28 11:30:37 2024 @@ -1,4 +1,4 @@ -.\" $NetBSD: env.1,v 1.15 2020/02/08 11:10:08 leot Exp $ +.\" $NetBSD: env.1,v 1.16 2024/10/28 11:30:37 kim Exp $ .\" .\" Copyright (c) 1980, 1990 The Regents of the University of California. .\" All rights reserved. @@ -30,9 +30,9 @@ .\" SUCH DAMAGE. .\" .\" from: @(#)printenv.1 6.7 (Berkeley) 7/28/91 -.\" $NetBSD: env.1,v 1.15 2020/02/08 11:10:08 leot Exp $ +.\" $NetBSD: env.1,v 1.16 2024/10/28 11:30:37 kim Exp $ .\" -.Dd February 8, 2020 +.Dd October 28, 2024 .Dt ENV 1 .Os .Sh NAME @@ -41,6 +41,7 @@ .Sh SYNOPSIS .Nm .Op Fl 0i +.Op Fl C Ar dir .Op Fl u Ar name .Op Ar name=value ... .Oo @@ -53,23 +54,28 @@ executes .Ar utility after modifying the environment as specified on the command line. -The option +Each .Ar name=value -specifies +option specifies an environmental variable, .Ar name , with a value of .Ar value . -The option +The .Sq Fl i -causes +option causes .Nm to completely ignore the environment it inherits. .Pp -The option +The +.Sq Fl C Ar dir +option causes the working directory to be changed to +.Ar dir . +.Pp +The .Sq Fl u Ar name -causes removal of the +option causes removal of the .Ar name environment variable if it is in the environment. This is similar to the @@ -92,9 +98,9 @@ Each pair is separated by a new line unless .Fl 0 is specified, in which case name/value pairs are separated by NUL. -Both +The .Fl 0 -and +option and .Ar utility must not be specified together. .Sh EXIT STATUS @@ -136,11 +142,12 @@ The historic option has been deprecated but is still supported in this implementation. .Pp The -.Fl u +.Fl C , u and .Fl 0 options are non-standard extensions. .Sh SEE ALSO +.Xr chdir 2 , .Xr execvp 3 , .Xr environ 7 .Sh STANDARDS @@ -160,6 +167,11 @@ and .Fl 0 options first appeared in .Nx 10 . +.Pp +The +.Fl C +option first appeared in +.Nx 10.1 . .Sh BUGS .Nm doesn't handle commands with equal Index: src/usr.bin/env/env.c diff -u src/usr.bin/env/env.c:1.23 src/usr.bin/env/env.c:1.24 --- src/usr.bin/env/env.c:1.23 Sat Feb 8 11:02:07 2020 +++ src/usr.bin/env/env.c Mon Oct 28 11:30:37 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: env.c,v 1.23 2020/02/08 11:02:07 kamil Exp $ */ +/* $NetBSD: env.c,v 1.24 2024/10/28 11:30:37 kim Exp $ */ /* * Copyright (c) 1988, 1993, 1994 * The Regents of the University of California. All rights reserved. @@ -36,7 +36,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19 #ifndef lint /*static char sccsid[] = "@(#)env.c 8.3 (Berkeley) 4/2/94";*/ -__RCSID("$NetBSD: env.c,v 1.23 2020/02/08 11:02:07 kamil Exp $"); +__RCSID("$NetBSD: env.c,v 1.24 2024/10/28 11:30:37 kim Exp $"); #endif /* not lint */ #include <err.h> @@ -62,11 +62,15 @@ main(int argc, char **argv) (void)setlocale(LC_ALL, ""); term = '\n'; - while ((ch = getopt(argc, argv, "-0iu:")) != -1) + while ((ch = getopt(argc, argv, "-0C:iu:")) != -1) switch((char)ch) { case '0': term = '\0'; break; + case 'C': + if (chdir(optarg) == -1) + err(EXIT_FAILURE, "chdir '%s'", optarg); + break; case '-': /* obsolete */ case 'i': environ = cleanenv; @@ -74,7 +78,7 @@ main(int argc, char **argv) break; case 'u': if (unsetenv(optarg) == -1) - errx(EXIT_FAILURE, "unsetenv %s", optarg); + err(EXIT_FAILURE, "unsetenv '%s'", optarg); break; case '?': default: @@ -107,7 +111,7 @@ static void usage(void) { (void)fprintf(stderr, - "Usage: %s [-0i] [-u name] [name=value ...] [command]\n", + "Usage: %s [-0i] [-C dir] [-u name] [name=value ...] [command]\n", getprogname()); exit(1); }