[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: option abbreviation exceptions
From: |
Eric Blake |
Subject: |
Re: option abbreviation exceptions |
Date: |
Sat, 10 Jan 2009 10:18:03 -0700 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081209 Thunderbird/2.0.0.19 Mnenhy/0.7.5.666 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
According to Jim Meyering on 12/29/2008 10:02 AM:
>> $ /bin/[ --help me | head -n1
>> /bin/[: missing `]'
>> $ /bin/[ --help | head -n1
>> Usage: test EXPRESSION
>> $ /bin/[ --hel | head -n1
>> Usage: test EXPRESSION
>>
>> Should the last example also complain about missing `]', rather than printing
>> help text?
>
> test and [ have always had a conflicted relationship
> with --help/--version.
>
> Making [ accept no abbreviations does seem like it'd be an improvement.
>
What do you think of this patch? It changes programs that take exactly
one of the two mandated options to only recognize exactly "--help" or
"--version" but not abbreviations. After the patch, I get:
$ src/basename --oops
src/basename: invalid option -- -
Try `src/basename --help' for more information.
$ src/basename --help me
src/basename: invalid option -- -
Try `src/basename --help' for more information.
$ src/basename --hel
src/basename: invalid option -- -
Try `src/basename --help' for more information.
$ src/basename --help | head -n2
Usage: src/basename NAME [SUFFIX]
or: src/basename OPTION
$ src/echo --he
- --he
In other words, most programs will treat --h identically to --oops,
diagnosing it as an invalid option (since the application only takes one
of two specific options), and exceptional programs, like echo or [, which
react differently to invalid options, will react the same way to an
abbreviation as to any other invalid option.
- --
Don't work too hard, make some time for fun as well!
Eric Blake address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAklo2EsACgkQ84KuGfSFAYCI7wCgxOjDYYv1iklsomt/HVvMr2dE
nZgAoMw8w66MjdbPSyw9h90CtS8k4goE
=HKir
-----END PGP SIGNATURE-----
>From b8f77e710856f8996cf0f149826691a0f75e71ec Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Sat, 10 Jan 2009 10:07:46 -0700
Subject: [PATCH] parse_long_options: don't accept abbreviations
* long-options.c (long_options): Ignore abbreviations, so that
/bin/echo --h prints --h rather than usage.
---
ChangeLog | 6 ++++++
lib/long-options.c | 13 +++++++++++--
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0c9bcfb..fad1240 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-01-10 Eric Blake <address@hidden>
+
+ parse_long_options: don't accept abbreviations
+ * long-options.c (long_options): Ignore abbreviations, so that
+ /bin/echo --h prints --h rather than usage.
+
2009-01-09 Paolo Bonzini <address@hidden>
regex: fix glibc bug 9697
diff --git a/lib/long-options.c b/lib/long-options.c
index 0286bdf..b605b68 100644
--- a/lib/long-options.c
+++ b/lib/long-options.c
@@ -1,7 +1,7 @@
/* Utility to accept --help and --version options as unobtrusively as possible.
Copyright (C) 1993, 1994, 1998, 1999, 2000, 2002, 2003, 2004, 2005,
- 2006 Free Software Foundation, Inc.
+ 2006, 2009 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
@@ -33,12 +33,21 @@
static struct option const long_options[] =
{
{"help", no_argument, NULL, 'h'},
+ {"hel", no_argument, NULL, ' '},
+ {"he", no_argument, NULL, ' '},
+ {"h", no_argument, NULL, ' '},
{"version", no_argument, NULL, 'v'},
+ {"versio", no_argument, NULL, ' '},
+ {"versi", no_argument, NULL, ' '},
+ {"vers", no_argument, NULL, ' '},
+ {"ver", no_argument, NULL, ' '},
+ {"ve", no_argument, NULL, ' '},
+ {"v", no_argument, NULL, ' '},
{NULL, 0, NULL, 0}
};
/* Process long options --help and --version, but only if argc == 2.
- Be careful not to gobble up `--'. */
+ Be careful not to gobble up `--'. Ignore abbreviations. */
void
parse_long_options (int argc,
--
1.6.0.4