Hi Richard, thanks for the good bug report plus patch.

Hi Herbert, please see below, and
 http://bugs.debian.org/456990
with pointers to freebsd and netbsd ash.

I agree this is a bug and should be fixed, Richard's patch looks good to
me.

Regards, Gerrit.


On Tue, Dec 18, 2007 at 05:02:46PM -0500, Richard M Kreuter wrote:
> The dash(1) in Debian stable does not support "set +o" in the manner
> specified by SUSv3:
> 
> |+o
> |    Write the current option settings to standard output in a format
> |    that is suitable for reinput to the shell as commands that
> |    achieve the same options settings.
> 
> (citation from
> http://www.opengroup.org/onlinepubs/009695399/utilities/set.html)
> 
> Instead, dash's "set +o" prints the shell's options in a
> human-readable format.
> 
> Here is a simple test program that exercises this feature; it works as
> I believe is required under bash, but not under dash.
> 
>   # Save the shell's options
>   set +o > /tmp/settings-commands
>   set -o | sort > /tmp/settings-before
>   # Change some options.
>   set -v
>   set -f
>   set -x
>   set +o emacs
>   set -o vi
>   # Try to restore our options.
>   . /tmp/settings-commands
>   set -o | sort > /tmp/settings-after
>   # Compare.
>   diff /tmp/settings-before /tmp/settings-after
> 
> I believe the following small patch adds this feature to dash, and
> documents it in the manual page:
> 
> --- src/options.c.orig        2005-11-25 22:17:55.000000000 -0500
> +++ src/options.c     2007-12-18 16:37:33.000000000 -0500
> @@ -240,10 +240,18 @@
>       int i;
>  
>       if (name == NULL) {
> -             out1str("Current option settings\n");
> -             for (i = 0; i < NOPTS; i++)
> -                     out1fmt("%-16s%s\n", optnames[i],
> -                             optlist[i] ? "on" : "off");
> +             if (val) {
> +                     out1str("Current option settings\n");
> +                     for (i = 0; i < NOPTS; i++)
> +                             out1fmt("%-16s%s\n", optnames[i],
> +                                     optlist[i] ? "on" : "off");
> +             } else {
> +                     for (i = 0; i < NOPTS; i++)
> +                             out1fmt("set %s %s\n",
> +                                     optlist[i] ? "-o" : "+o",
> +                                     optnames[i]);
> +
> +             }
>       } else {
>               for (i = 0; i < NOPTS; i++)
>                       if (equal(name, optnames[i])) {
> --- src/dash.1~       2005-11-25 22:17:55.000000000 -0500
> +++ src/dash.1        2007-12-18 16:16:04.000000000 -0500
> @@ -1779,6 +1779,11 @@
>  If options are given, it sets the specified option
>  flags, or clears them as described in the section called
>  .Sx Argument List Processing .
> +As a special case, if the option is -o or +o and no argument is
> +supplied, the shell prints the settings of all its options.  If the
> +option is -o, the settings are printed in a human-readable format; if
> +the option is +o, the settings are printed in a format suitable for
> +reinput to the shell to affect the same option settings.
>  .Pp
>  The third use of the set command is to set the values of the shell's
>  positional parameters to the specified args.
> 
> -- System Information:
> Debian Release: 4.0
>   APT prefers stable
>   APT policy: (500, 'stable')
> Architecture: powerpc (ppc)
> Shell:  /bin/sh linked to /bin/bash
> Kernel: Linux 2.6.18-5-powerpc
> Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
> 
> Versions of packages dash depends on:
> ii  libc6                  2.3.6.ds1-13etch2 GNU C Library: Shared libraries
> 
> dash recommends no packages.
> 
> -- debconf information:
>   dash/sh: false
> 
> 



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to