xref: /third_party/toybox/toys/posix/env.c (revision 0f66f451)
1/* env.c - Set the environment for command invocation.
2 *
3 * Copyright 2012 Tryn Mirell <tryn@mirell.org>
4 *
5 * http://opengroup.org/onlinepubs/9699919799/utilities/env.html
6 *
7 * Deviations from posix: "-" argument and -0
8
9USE_ENV(NEWTOY(env, "^0iu*", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_ARGFAIL(125)))
10
11config ENV
12  bool "env"
13  default y
14  help
15    usage: env [-i] [-u NAME] [NAME=VALUE...] [COMMAND [ARG...]]
16
17    Set the environment for command invocation, or list environment variables.
18
19    -i	Clear existing environment
20    -u NAME	Remove NAME from the environment
21    -0	Use null instead of newline in output
22*/
23
24#define FOR_env
25#include "toys.h"
26
27GLOBALS(
28  struct arg_list *u;
29);
30
31void env_main(void)
32{
33  char **ev = toys.optargs;
34  struct arg_list *u;
35
36  // If first nonoption argument is "-" treat it as -i
37  if (*ev && **ev == '-' && !(*ev)[1]) {
38    toys.optflags |= FLAG_i;
39    ev++;
40  }
41
42  if (FLAG(i)) xclearenv();
43  else for (u = TT.u; u; u = u->next) xunsetenv(u->arg);
44
45  for (; *ev; ev++)
46    if (strchr(*ev, '=')) xsetenv(xstrdup(*ev), 0);
47    else {
48      // a common use of env is to bypass shell builtins
49      toys.stacktop = 0;
50      xexec(ev);
51    }
52
53  for (ev = environ; *ev; ev++) xprintf("%s%c", *ev, '\n'*!FLAG(0));
54}
55