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

Re: [BUG] builtin echo doesn't check write error



Since this message from Stephane got truncated in the archives
before a line starting with "From "

  https://www.zsh.org/mla/workers/2021/msg01272.html

I'm including it entirely below, quoted to avoid this issue.
I've just posted a message

  https://www.zsh.org/mla/workers/2021/msg01334.html
  archived messages with "From " get truncated

about this truncation issue.

Note also about the bug in echo/print/etc., this actually seems
to affect *all* builtins. For instance:

zira% (exec >&-; echo)
zsh: write error: bad file descriptor
zira% (exec >&-; echo >&-)
zira% (exec >&-; print)
zsh: write error: bad file descriptor
zira% (exec >&-; print >&-)
zira% (exec >&-; printf "\n")
zsh: write error: bad file descriptor
zira% (exec >&-; printf "\n" >&-)
zira% (exec >&-; pwd)
zsh: write error: bad file descriptor
zira% (exec >&-; pwd >&-)
zira% (exec >&-; history)
zsh: write error: bad file descriptor
zira% (exec >&-; history >&-)
zira% 

On 2021-06-09 19:16:17 +0100, Stephane Chazelas wrote:
> 2021-06-09 09:13:42 -0700, Bart Schaefer:
> [...]
> > My (possibly poor) recollection is that this was made this way in part
> > for ports to environments that don't have a /dev/null device
> 
> While that sounds like a very plausible reason for the original
> behaviour whereby "print" would not report any write error,
> that doesn't really tie up with the current behaviour where
> the error is supressed only when print/echo's stdout is
> explicitly closed.
> 
> Why would one write print foo >&- in the first place, other than
> to check whether print reports error or not (and in that regard,
> the behaviour is very misleading)
> 
> From looking at the history, it looks more like:
> 
> 1990 (1.0) echo ignores write failures (by design or not).
> 1999 workers/9129 Peter writes the "print foo >&-" succeeds, no
>      error test case, just documenting the actual behaviour of
>      print ignoring errors (here using >&- as the easiest way to
>      trigger a write error).
> 2002 workers/16503 Clint adds some error messages upon write
>      errors.
> 2002 workers/16556 we realise it breaks the test case above, so
>      Bart removes the error message on EBADF for that test case
>      to pass again. The fact that there's still an error message
>      in (print)>&- looks like an oversight. The error in that
>      case is output by execcmd_exec after print has returned as
>      it tries to fflush stdout again,, not bin_print (you'll
>      notice the error message doesn't mention "print").
> 2011 workers/29845 Peter notices the error is displayed in
>      (exec >&-; print) and adds a test case for it, but I'm not
>      sure he correctly identified why.
> 
> It very much looks like an (multiple) accident of
> implementation.
> 
> POSIX does say that printf/echo should return with a non-zero
> exit status upon error, and stderr be used for diagnostix
> errors as usual. It's not clear to me if implementations are at
> liberty to decide whether a write() error is considered an error
> or not.
> 
> In any case, it would be useful from an error point of view to
> be able to detect when writing fails.

-- 
Vincent Lefèvre <vincent@xxxxxxxxxx> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)




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