bug-coreutils
[Top][All Lists]
Advanced

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

Re: 5.93 tail -N foo bar invalid option


From: Paul Eggert
Subject: Re: 5.93 tail -N foo bar invalid option
Date: Mon, 30 Jan 2006 17:51:43 -0800
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

address@hidden (Karl Berry) writes:

> I just expected GNU tail -3 to behave the same as GNU head -3, since
> GNU is supposed to do things right :).

It depends on what you mean by "right", but I think GNU head -3
doesn't behave "right" either, if one expects options like "-3" to
"just work".  For example:

   $ head -v -3
   head: invalid option -- 3
   Try `head --help' for more information.

There is a similar problem with "head -v -34", "head -34n", and "head -3v4".
(Not to mention with "tail".)

The code to implement numeric options like "-34" is tricky due to the
desire to be backward-compatible with old, broken software and
standards.  If you explore it you'll always be able to find weird
corners.  I see no way to generalize them in a clean way.  It's
particularly tricky with "tail", since the old and new syntaxes are
flat-out incompatible.  I looked into adding support for "tail -3 a b
c", and the only way I could see to do it reliably (after about an
hour of trying to implement it in other ways) was to add a special
case for the exact usage "tail -DIGITS ARG ARG [ARG]....", where none
of the ARGs start with "-".  That's no way to run a railroad.

> The error `invalid option -- 3' just confused me more, since it's not
> the -3 that is invalid.

_That_ we can fix.  I installed the following.


2006-01-30  Paul Eggert  <address@hidden>

        * doc/coreutils.texi (tail invocation): In the obsolete usage, the
        count is optional, so put square brackets around it.
        * src/head.c (main): Use a better diagnostic when someone uses a
        trailing numeric option in an invalid way.  Problem reported by
        Karl Berry.
        * src/tail.c (parse_options): Likewise.

Index: doc/coreutils.texi
===================================================================
RCS file: /fetish/cu/doc/coreutils.texi,v
retrieving revision 1.307
diff -p -u -r1.307 coreutils.texi
--- doc/coreutils.texi  3 Jan 2006 00:45:06 -0000       1.307
+++ doc/coreutils.texi  31 Jan 2006 01:29:33 -0000
@@ -2551,7 +2551,7 @@ Always print file name headers.
 @end table
 
 For compatibility @command{tail} also supports an obsolete usage
address@hidden address@hidden address@hidden, which is recognized
address@hidden address@hidden address@hidden, which is recognized
 only if it does not conflict with the usage described
 above.  This obsolete form uses exactly one option and at most one
 file.  In the option, @var{count} is an optional decimal number optionally
Index: src/head.c
===================================================================
RCS file: /fetish/cu/src/head.c,v
retrieving revision 1.104
diff -p -u -r1.104 head.c
--- src/head.c  3 Dec 2005 22:23:30 -0000       1.104
+++ src/head.c  31 Jan 2006 01:29:33 -0000
@@ -1,5 +1,5 @@
 /* head -- output first part of file(s)
-   Copyright (C) 89, 90, 91, 1995-2005 Free Software Foundation, Inc.
+   Copyright (C) 89, 90, 91, 1995-2006 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -973,7 +973,7 @@ main (int argc, char **argv)
              break;
 
            default:
-             error (0, 0, _("unrecognized option `-%c'"), *a);
+             error (0, 0, _("invalid trailing option -- %c"), *a);
              usage (EXIT_FAILURE);
            }
        }
@@ -992,7 +992,8 @@ main (int argc, char **argv)
       argc--;
     }
 
-  while ((c = getopt_long (argc, argv, "c:n:qv", long_options, NULL)) != -1)
+  while ((c = getopt_long (argc, argv, "c:n:qv0123456789", long_options, NULL))
+        != -1)
     {
       switch (c)
        {
@@ -1029,6 +1030,8 @@ main (int argc, char **argv)
        case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
 
        default:
+         if (ISDIGIT (c))
+           error (0, 0, _("invalid trailing option -- %c"), c);
          usage (EXIT_FAILURE);
        }
     }
Index: src/tail.c
===================================================================
RCS file: /fetish/cu/src/tail.c,v
retrieving revision 1.248
diff -p -u -r1.248 tail.c
--- src/tail.c  24 Jan 2006 10:32:32 -0000      1.248
+++ src/tail.c  31 Jan 2006 01:29:33 -0000
@@ -1455,7 +1455,8 @@ parse_options (int argc, char **argv,
 {
   int c;
 
-  while ((c = getopt_long (argc, argv, "c:n:fFqs:v", long_options, NULL))
+  while ((c = getopt_long (argc, argv, "c:n:fFqs:v0123456789",
+                          long_options, NULL))
         != -1)
     {
       switch (c)
@@ -1553,6 +1554,11 @@ parse_options (int argc, char **argv,
 
        case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
 
+       case '0': case '1': case '2': case '3': case '4':
+       case '5': case '6': case '7': case '8': case '9':
+         error (EXIT_FAILURE, 0,
+                _("option used in invalid context -- %c"), c);
+
        default:
          usage (EXIT_FAILURE);
        }




reply via email to

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