* bug: nested for loop body is executed once! @ 2021-08-13 3:13 Daniil Iaitskov 2021-08-13 3:47 ` Matthew Martin 2021-08-13 3:50 ` Lawrence Velázquez 0 siblings, 2 replies; 4+ messages in thread From: Daniil Iaitskov @ 2021-08-13 3:13 UTC (permalink / raw) To: zsh-workers [-- Attachment #1: Type: text/plain, Size: 778 bytes --] Hi, I just spot a following bug on Big Sur zsh 5.8 (x86_64-apple-darwin20.0) $ K="1 2 3" > $ for i in $(for j in $K; do echo "ddd/$j" ; done) ; do echo "$i" ; done > ddd/1 > 2 > 3 > I would expect following output > ddd/1 > ddd/2 > ddd/3 > this breaks referential transparency - sorry for FP buzzwords ;) because $ for i in $(for j in $(echo 1 2 3); do echo "ddd/$j" ; done) ; do echo > "$i" ; done > produce expected output: > ddd/1 > ddd/2 > ddd/3 > I don't know if this is a feature due to some legacy optimizations. I mostly use BASH and this behavior differs from BASH. BASH behaves exactly as I expect. P.S. Wow! Are you still using just a mailing list for bug tracking?! I hope my HTML email will be rendered correctly ;) -- Best regards, Daniil Iaitskov [-- Attachment #2: Type: text/html, Size: 1867 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: bug: nested for loop body is executed once! 2021-08-13 3:13 bug: nested for loop body is executed once! Daniil Iaitskov @ 2021-08-13 3:47 ` Matthew Martin 2021-08-13 3:50 ` Lawrence Velázquez 1 sibling, 0 replies; 4+ messages in thread From: Matthew Martin @ 2021-08-13 3:47 UTC (permalink / raw) To: zsh-workers On Thu, Aug 12, 2021 at 11:13:09PM -0400, Daniil Iaitskov wrote: > Hi, > > I just spot a following bug on Big Sur zsh 5.8 (x86_64-apple-darwin20.0) > > $ K="1 2 3" > > $ for i in $(for j in $K; do echo "ddd/$j" ; done) ; do echo "$i" ; done > > ddd/1 > > 2 > > 3 That's because zsh doesn't do word splitting on parameter expansions by default. Running under set -x is illuminating. +zsh:3> j=1 2 3 +zsh:3> echo 'ddd/1 2 3' +zsh:3> i=ddd/1 +zsh:3> echo ddd/1 ddd/1 +zsh:3> i=2 +zsh:3> echo 2 2 +zsh:3> i=3 +zsh:3> echo 3 3 j is assigned '1 2 3' and the result of the command substitution is 'ddd/1 2 3'. However word splitting does happen on unquoted command substitutions, so i is assigned to thrice. > I would expect following output > > > ddd/1 > > ddd/2 > > ddd/3 You want an array: K=(1 2 3) At which point you could skip the command substitution and instead for i in ddd/$^K; do ... ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: bug: nested for loop body is executed once! 2021-08-13 3:13 bug: nested for loop body is executed once! Daniil Iaitskov 2021-08-13 3:47 ` Matthew Martin @ 2021-08-13 3:50 ` Lawrence Velázquez 2021-08-14 15:07 ` Daniel Shahaf 1 sibling, 1 reply; 4+ messages in thread From: Lawrence Velázquez @ 2021-08-13 3:50 UTC (permalink / raw) To: Daniil Iaitskov; +Cc: zsh-workers On Thu, Aug 12, 2021, at 11:13 PM, Daniil Iaitskov wrote: > I just spot a following bug on Big Sur zsh 5.8 (x86_64-apple-darwin20.0) It's not a bug. > > $ K="1 2 3" > > $ for i in $(for j in $K; do echo "ddd/$j" ; done) ; do echo "$i" ; done > > ddd/1 > > 2 > > 3 > > I would expect following output > > ddd/1 > > ddd/2 > > ddd/3 By default, zsh does not word-split unquoted parameter expansions; this behavior differs from most Bourne-adjacent shells. Observe that your "inner" loop actually only loops once, with $j taking on the entire value of $K: % K="1 2 3" % for j in $K; do echo "<ddd/$j>"; done <ddd/1 2 3> However, zsh *does* word-split unquoted command substitutions, so the output of $(for j in $K; do echo "ddd/$j" ; done) is split into 'ddd/1', '2', and '3', and $i takes on each value in turn. > > $ for i in $(for j in $(echo 1 2 3); do echo "ddd/$j" ; done) ; do echo "$i" ; done > > produce expected output: > > ddd/1 > > ddd/2 > > ddd/3 In this example, $(echo 1 2 3) is word-split because it is a command substitution. Thus, $j takes on the values '1', '2', and '3', as you expected. > I don't know if this is a feature due to some legacy optimizations. > I mostly use BASH and this behavior differs from BASH. > BASH behaves exactly as I expect. Actually, many zsh users consider the word-splitting of unquoted parameter expansions to be a misfeature, which zsh's default behavior remedies. In any case, it's very much intentional. You can obtain word-splitting behavior with the ${=foo} form: % K="1 2 3" % for j in ${=K}; do echo "<ddd/$j>"; done <ddd/1> <ddd/2> <ddd/3> You can also set SH_WORD_SPLIT, or rewrite the code to use an array. If you're running code that relies on word-splitting (a POSIX script, perhaps), you can run it under sh emulation. > Wow! Are you still using just a mailing list for bug tracking?! Yes. -- vq ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: bug: nested for loop body is executed once! 2021-08-13 3:50 ` Lawrence Velázquez @ 2021-08-14 15:07 ` Daniel Shahaf 0 siblings, 0 replies; 4+ messages in thread From: Daniel Shahaf @ 2021-08-14 15:07 UTC (permalink / raw) To: Lawrence Velázquez, Daniil Iaitskov; +Cc: zsh-workers Lawrence Velázquez wrote on Fri, 13 Aug 2021 03:50 +00:00: > On Thu, Aug 12, 2021, at 11:13 PM, Daniil Iaitskov wrote: > > Wow! Are you still using just a mailing list for bug tracking?! > > Yes. We do have various ways to track bugs, such as Etc/BUGS, but bug _reports_ should go to the mailing list, yes. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-08-14 15:08 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-08-13 3:13 bug: nested for loop body is executed once! Daniil Iaitskov 2021-08-13 3:47 ` Matthew Martin 2021-08-13 3:50 ` Lawrence Velázquez 2021-08-14 15:07 ` Daniel Shahaf
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).