summary refs log tree commit diff
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
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 '')
-rw-r--r--ChangeLog4
-rw-r--r--src/dash.15
-rw-r--r--src/options.c16
3 files changed, 21 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index e72849c..10ec45c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-12-23  Richard M Kreuter <kreuter@progn.net>
+
+	* Add set +o support.
+
 2007-12-23  Steve Langasek <steve.langasek@canonical.com>
 
 	* Fixed bad pointer arithmetic in evalcommand.
diff --git a/src/dash.1 b/src/dash.1
index 9b8ab0e..b4140eb 100644
--- a/src/dash.1
+++ b/src/dash.1
@@ -1782,6 +1782,11 @@ With no arguments, it lists the values of all shell variables.
 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.
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])) {