toybox/toys/posix/env.c
<<
>>
Prefs
   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 xexec(ev);
  48
  49  for (ev = environ; *ev; ev++) xprintf("%s%c", *ev, '\n'*!FLAG(0));
  50}
  51