diff options
author | Richard M Kreuter <kreuter@progn.net> | 2007-12-23 11:24:48 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2007-12-23 11:24:48 +0800 |
commit | 1b212d313de17ce3fbe0441b4269e2bf47b2dd68 (patch) | |
tree | d7826e158c598af46924097a3d59df0e7f697e1a /src/options.c | |
parent | [EVAL] Fix bad pointer arithmetic in evalcommand (diff) | |
download | dash-1b212d313de17ce3fbe0441b4269e2bf47b2dd68.tar.gz dash-1b212d313de17ce3fbe0441b4269e2bf47b2dd68.zip |
[BUILTIN] Add set +o support
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: Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to '')
-rw-r--r-- | src/options.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/options.c b/src/options.c index f669117..48c9671 100644 --- a/src/options.c +++ b/src/options.c @@ -240,10 +240,18 @@ minus_o(char *name, int val) 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])) { |