Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: 'case' zeroes "$?"



On Sun, 9 Oct 2016 23:01:35 +0200
Martijn Dekker <martijn@xxxxxxxx> wrote:
> Unlike on other shells, 'case' on zsh zeroes "$?" before executing a
> command within 'case', making it more inconvenient to test exit status.
> 
> Example:
> 
> (exit 37) || case $? in 37) echo "$?";; esac

This looks straightforward.  The first $? in the case pattern is expanded
as a command line argument, before the case is executed, so missed this.

diff --git a/Src/loop.c b/Src/loop.c
index 3b9d021..94b61b7 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -592,7 +592,6 @@ execcase(Estate state, int do_exec)
     word = ecgetstr(state, EC_DUP, NULL);
     singsub(&word);
     untokenize(word);
-    lastval = 0;
 
     cmdpush(CS_CASE);
     while (state->pc < end) {
diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst
index 0b1085c..0e77f3e 100644
--- a/Test/A01grammar.ztst
+++ b/Test/A01grammar.ztst
@@ -757,6 +757,14 @@
 >}
 >Stuff here
 
+  (exit 37)
+  case $? in
+    (37) echo $?
+    ;;
+  esac
+0:case retains exit status for execution of cases
+>37
+
   x=1
   x=2 | echo $x
   echo $x



Messages sorted by: Reverse Date, Date, Thread, Author