coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] printenv: add feature to print names only


From: Pádraig Brady
Subject: Re: [PATCH] printenv: add feature to print names only
Date: Tue, 13 Dec 2022 13:04:31 +0000
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.0

On 11/12/2022 17:07, Gianluca Mascolo wrote:
From 0ed502c97c5b1dd51dc323e3f1354db99d1ab46f Mon Sep 17 00:00:00 2001
From: Gianluca Mascolo <gianluca@gurutech.it>
Date: Sun, 11 Dec 2022 18:02:20 +0100
Subject: [PATCH] printenv: add feature to print names only

---
  src/printenv.c         | 13 +++++++++++--
  tests/misc/printenv.sh |  3 +++
  2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/printenv.c b/src/printenv.c
index 0b178bedd..47eff3c91 100644
--- a/src/printenv.c
+++ b/src/printenv.c
@@ -47,6 +47,7 @@ enum { PRINTENV_FAILURE = 2 };
  static struct option const longopts[] =
  {
    {"null", no_argument, NULL, '0'},
+  {"names-only", no_argument, NULL, 'n'},
    {GETOPT_HELP_OPTION_DECL},
    {GETOPT_VERSION_OPTION_DECL},
    {NULL, 0, NULL, 0}
@@ -68,6 +69,7 @@ If no VARIABLE is specified, print name and value pairs for 
them all.\n\
                program_name);
        fputs (_("\
    -0, --null     end each output line with NUL, not newline\n\
+  -n, --names-only     output only variable name, not value\n\
  "), stdout);
        fputs (HELP_OPTION_DESCRIPTION, stdout);
        fputs (VERSION_OPTION_DESCRIPTION, stdout);
@@ -86,6 +88,7 @@ main (int argc, char **argv)
    bool ok;
    int optc;
    bool opt_nul_terminate_output = false;
+  bool opt_names_only = false;
initialize_main (&argc, &argv);
    set_program_name (argv[0]);
@@ -96,13 +99,16 @@ main (int argc, char **argv)
    initialize_exit_failure (PRINTENV_FAILURE);
    atexit (close_stdout);
- while ((optc = getopt_long (argc, argv, "+iu:0", longopts, NULL)) != -1)
+  while ((optc = getopt_long (argc, argv, "+iu:0n", longopts, NULL)) != -1)
      {
        switch (optc)
          {
          case '0':
            opt_nul_terminate_output = true;
            break;
+        case 'n':
+          opt_names_only = true;
+          break;
          case_GETOPT_HELP_CHAR;
          case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
          default:
@@ -113,7 +119,10 @@ main (int argc, char **argv)
    if (optind >= argc)
      {
        for (env = environ; *env != NULL; ++env)
-        printf ("%s%c", *env, opt_nul_terminate_output ? '\0' : '\n');
+        printf ("%.*s%c",
+                opt_names_only ? ((int) (strchr(*env,'=') - *env)) : ((int) 
strlen(*env)),
+                *env,
+                opt_nul_terminate_output ? '\0' : '\n');
        ok = true;
      }
    else
diff --git a/tests/misc/printenv.sh b/tests/misc/printenv.sh
index 6cee5e7de..d97277fa1 100755
--- a/tests/misc/printenv.sh
+++ b/tests/misc/printenv.sh
@@ -58,6 +58,9 @@ b
  EOF
  compare exp out || fail=1
+# Print only variable names
+env -i ENV_TEST=hidden PATH="$PATH" printenv | grep -qF hidden && fail=1
+
  # Exit status reflects missing variable, but remaining arguments processed.
  export ENV_TEST1=a
  returns_ 1 env -- printenv ENV_TEST2 ENV_TEST1 > out || fail=1


This has some merit,
given that's it's awkward to postprocess printenv output
in the presence of multiline env values.

Could you detail some use cases for this?

thanks,
Pádraig



reply via email to

[Prev in Thread] Current Thread [Next in Thread]