Re: getting zsh into POSIX mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Eric Blake on 7/9/2009 6:13 AM:
> In looking at it further, one of the differences is that zsh enables
> notify mode (set -b) by default, although POSIX states that notify mode
> should default to off (set +b).  'emulate sh' does not change the current
> state of the notify option, but 'emulate -R sh' forces it to off.
> Generally, notify does not affect non-interactive script behavior, since
> it only matters when monitor (set -m) is enabled, and that is off by
> default for non-interactive use.  But for parallel testsuites, we really
> DO want to have notify disabled so that we don't have to deal with
> asynchronous outputs to stderr as test groups complete.

Done as follows.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             ebb9@xxxxxxx
-----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

iEYEARECAAYFAkpcB9kACgkQ84KuGfSFAYCW9wCff/LFclUfuQ0PwE1fCgKrsmdh
1NoAn0Sgcv9LeWb4fM14nIRzR+B2lFbh
=g34L
-----END PGP SIGNATURE-----
>From d8db042ad03bd140212c528077f9b5589da91d49 Mon Sep 17 00:00:00 2001
From: Eric Blake <ebb9@xxxxxxx>
Date: Mon, 13 Jul 2009 12:54:19 -0600
Subject: [PATCH] Disable asynchronous job notification for parallel tests.

* lib/autotest/general.m4 (AT_INIT) <Driver loop>: Turn off notify
mode, since zsh leaves it on after 'emulate sh'.
* doc/autoconf.texi (Limitations of Builtins) <set>: Document that
job control options are not portable.

Signed-off-by: Eric Blake <ebb9@xxxxxxx>
---
 ChangeLog               |    6 ++++++
 doc/autoconf.texi       |   29 +++++++++++++++++++++++++++++
 lib/autotest/general.m4 |    3 ++-
 3 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 37b7b15..26ddce0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2009-07-13  Eric Blake  <ebb9@xxxxxxx>

+	Disable asynchronous job notification for parallel tests.
+	* lib/autotest/general.m4 (AT_INIT) <Driver loop>: Turn off notify
+	mode, since zsh leaves it on after 'emulate sh'.
+	* doc/autoconf.texi (Limitations of Builtins) <set>: Document that
+	job control options are not portable.
+
 	Guarantee that exit status trumps output matching.
 	* doc/autoconf.texi (Writing Testsuites) <AT_CHECK>: Document this
 	better.
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index a4aed6f..cd2a65d 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -16257,6 +16257,35 @@ Limitations of Builtins
 @samp{set -e}, it is better to append @samp{|| AS_EXIT} to any
 statement where it is desirable to abort on failure.

+@cindex @command{set -b}
+@cindex @command{set -m}
+Job control is not provided by all shells, so the use of @samp{set -m}
+or @samp{set -b} must be done with care.  When using @command{zsh} in
+native mode, asynchronous notification (@samp{set -b}) is enabled by
+default, and using @samp{emulate sh} to switch to Posix mode does not
+clear this setting (although asynchronous notification has no impact
+unless job monitoring is also enabled).  Also, @command{zsh} 4.3.10 and
+earlier have a bug where job control can be manipulated in interactive
+shells, but not in subshells or scripts.  Furthermore, some shells, like
+@command{pdksh}, fail to treat subshells as interactive, even though the
+parent shell was.
+
+@example
+$ @kbd{echo $ZSH_VERSION}
+4.3.10
+$ @kbd{set -m; echo $?}
+0
+$ @kbd{zsh -c 'set -m; echo $?'}
+set: can't change option: -m
+$ @kbd{(set -m); echo $?}
+set: can't change option: -m
+1
+$ @kbd{pdksh -ci 'echo $-; (echo $-)'}
+cim
+c
+@end example
+
+
 @item @command{shift}
 @c ------------------
 @prindex @command{shift}
diff --git a/lib/autotest/general.m4 b/lib/autotest/general.m4
index b9beb0e..cf88b99 100644
--- a/lib/autotest/general.m4
+++ b/lib/autotest/general.m4
@@ -1250,7 +1250,8 @@ dnl shell to start each parallel task as its own shell job, thus as a new
 dnl process group leader.  We then send the signal to all new process groups.

 dnl Do we have job control?
-if (set -m && set +m) >/dev/null 2>&1; then
+if (set -m && set +m && set +b) >/dev/null 2>&1; then
+  set +b
   at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=-
 else
   at_job_control_on=: at_job_control_off=: at_job_group=
-- 
1.6.3.3.334.g916e1

_______________________________________________
Autoconf mailing list
Autoconf@xxxxxxx
http://lists.gnu.org/mailman/listinfo/autoconf

[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux