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

Re: kill the LHS command of a pipe once the RHS command terminates



On 2019-07-29 08:54:19 -0700, Bart Schaefer wrote:
> On Mon, Jul 29, 2019 at 8:24 AM Vincent Lefevre <vincent@xxxxxxxxxx> wrote:
> >
> > On 2019-06-28 13:04:30 +0200, Vincent Lefevre wrote:
> > >
> > > zira% head -n 1 <(echo foo; sleep 3; echo err >&2)
> > > foo
> >
> > Another issue is that if the producer side tries to access the terminal
> > (e.g. ssh, for a passphrase), all the processes of this side are stopped
> > due to a SIGTTOU signal.
> 
> Even if they weren't stopped by TTOU, they'd almost certainly be
> stopped by TTIN.

Yes.

> > Concerning the documentation, the zshexpn(1) man page does not say
> > that a process in process substitution is run in background.
> 
> They have to be, otherwise either you'd need unlimited buffering or
> the read of the descriptor could deadlock.

I don't see how this is related to buffering. This would be the same
case as with a pipe (cmd1 | cmd2), for which both commands run in
foreground and there are no buffering issues.

> If you want it run in the foreground, use =(...).

That's not OK, because the main command is started only when
the =(...) command terminates:

zira% echo =(echo a; sleep 3; echo b)

gives its output (the temporary file) only after 3 seconds. And even
without this problem, I'm not sure that this would work with a pager,
as it would think that once a EOF has occurred, there is no more
output.

> > Later there's a mention of it being run asynchronously, but this
> > term has never been defined.
> 
> In the JOBS section:
> 
>        If the MONITOR option is set, an interactive shell associates
>        a job with each pipeline. It keeps a table of current jobs,
>        printed by the jobs command, and assigns them small integer
>        numbers. When a job is started asynchronously with `&', the
>        shell prints a line to standard error which looks like:
[...]

As described, the "asynchronously" concerns only jobs started with "&".
BTW, there is nothing in the job table:

zira% echo <(sleep 3); jobs
/proc/self/fd/11
zira%

> And then in the SIGNALS section:
> 
>        Certain jobs are run asynchronously by the shell other than
>        those explicitly put into the background;

It says that jobs explicitly put into the background are run
asynchronously, but nothing about the converse.

-- 
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