summary refs log tree commit diff
path: root/src/options.c
diff options
context:
space:
mode:
authorRichard M Kreuter <kreuter@progn.net>2007-12-23 11:24:48 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2007-12-23 11:24:48 +0800
commit1b212d313de17ce3fbe0441b4269e2bf47b2dd68 (patch)
treed7826e158c598af46924097a3d59df0e7f697e1a /src/options.c
parent[EVAL] Fix bad pointer arithmetic in evalcommand (diff)
downloaddash-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 'src/options.c')
-rw-r--r--src/options.c16
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])) {