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

Re: Strange parameter visibility



On Sat, 17 Sep 2016 20:11:37 +0200
Kamil Jońca <kjonca@xxxxx> wrote:
> --8<---------------cut here---------------start------------->8---
> %(x=1; x=2 | echo $x ; echo $x) 
> 2
> 2
> --8<---------------cut here---------------end--------------->8---
> 
> What there are "2"-s in second example?

Try this.

This isn't an optimisation gone awry --- we just plain miss out on
checking that the LHS of the pipeline is supposed to run in the shell so
we need to fork to do that, as we do in other cases.  It's obviously
never come up because the assigment is redundant, or should be.

We might be able to renumber the WC_ codes to make this more efficient.

pws

diff --git a/Src/exec.c b/Src/exec.c
index c79a278..e3915dd 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1844,7 +1844,8 @@ execpline2(Estate state, wordcode pcode,
 	/* if we are doing "foo | bar" where foo is a current *
 	 * shell command, do foo in a subshell and do the     *
 	 * rest of the pipeline in the current shell.         */
-	if (wc_code(code) >= WC_CURSH && (how & Z_SYNC)) {
+	if ((wc_code(code) >= WC_CURSH || wc_code(code) == WC_ASSIGN)
+	    && (how & Z_SYNC)) {
 	    int synch[2];
 	    struct timeval bgtime;
 
diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst
index 921ff99..0b1085c 100644
--- a/Test/A01grammar.ztst
+++ b/Test/A01grammar.ztst
@@ -756,3 +756,10 @@
 >	print Stuff here
 >}
 >Stuff here
+
+  x=1
+  x=2 | echo $x
+  echo $x
+0:Assignment-only current shell commands in LHS of pipelin
+>1
+>1



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