Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: 'while do done' hangs interactive zsh
- X-seq: zsh-workers 48845
- From: Stephane Chazelas <stephane@xxxxxxxxxxxx>
- To: Arseny Maslennikov <ar@xxxxxxxxx>
- Cc: zsh-workers@xxxxxxx
- Subject: Re: 'while do done' hangs interactive zsh
- Date: Sun, 16 May 2021 17:43:28 +0100
- Archived-at: <https://zsh.org/workers/48845>
- In-reply-to: <YKDi6GYtnBt1ZYTU@cello>
- List-id: <zsh-workers.zsh.org>
- Mail-followup-to: Arseny Maslennikov <ar@xxxxxxxxx>, zsh-workers@xxxxxxx
- References: <YKDi6GYtnBt1ZYTU@cello>
2021-05-16 12:16:24 +0300, Arseny Maslennikov:
> Hi everyone!
>
> When zsh tries to execute "while do; done", it enters a busy loop:
>
> % dash -c 'while do; done'
> dash: 1: Syntax error: "do" unexpected
> % bash -c 'while do; done'
> bash: -c: line 1: syntax error near unexpected token `do'
> bash: -c: line 1: `while do; done'
> % zsh -c 'while do; done' # never finishes/prompts by itself
> ^C
> zsh -c 'while do; done' 27,73s user 0,00s system 99% cpu 27,732 total 4k maxrss
>
> Even more, if the user enters "while do; done" in an interactive zsh
> instance, the busy loop is not interruptible by ^C, ^\ or ^Z; the shell
> has to be killed via some external means.
>
> To be fair, I have discovered the bug with the semicolon omitted ("while do done").
[...]
As far as I can tell, it works as documented.
while LIST do LIST done
LIST is not explicitely specified, but it does appear to be a
list of 0 or more pipelines. Or in other words any script.
So:
while do done
Runs the empty list of pipelines as long as the empty list of
pipelines is successful.
You'll see you can also do
if then echo the empty list is successful; fi
repeat 1000000 do done
myfunc() { }
if [ -e x ]; then else echo does not exist; fi
That does not even make zsh non-POSIX compliant, as those are
not valid POSIX sh syntax, so implementations are free to do
whatever they want.
If you want your *script* to be portable, you should not write:
while do echo yes; done
as a forever loop, as other shells require at least one pipeline
in the condition LIST (which to me just looks like an
arbitrary, unecessary limitation), but that does not mean shell
implementations have to return an error here.
--
Stephane
Messages sorted by:
Reverse Date,
Date,
Thread,
Author