zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: Zsh Users <zsh-users@zsh.org>
Subject: Re: kill the LHS command of a pipe once the RHS command terminates
Date: Sat, 29 Jun 2019 09:17:13 -0700	[thread overview]
Message-ID: <CAH+w=7bUROc+9idB-K7ja_mO6BfNAnj0Hq+gUs1678p3FDE9Gg@mail.gmail.com> (raw)
In-Reply-To: <20190628110430.GA13790@zira.vinc17.org>

On Fri, Jun 28, 2019 at 4:05 AM Vincent Lefevre <vincent@vinc17.net> wrote:
>
> With some commands I pipe the output to a pager, and when quitting
> the pager, I want the command to terminate immediately (so that it
> doesn't consume more resources) and want the shell prompt back.

This is going to happen in cases where the left-side command doesn't
produce enough output to fill the OS buffer used for the pipe, so it
doesn't see the end-of-file or receive the PIPE signal when the
right-side command closes the other end.  In your examples, you've
also got compound structures that are actually ignoring the state of
their standard output once the small amount of initial output has been
sent.  Neither the shell nor the OS has any way of "knowing" that you
didn't INTEND those commands to continue running.

> Does zsh provide a feature to kill the left-hand-side command in a
> clean way (without a race condition, without a temporary file...)?

That's supposed to be the EOF+SIGPIPE, but it only works for "well
behaved" commands that are actually doing something useful with their
standard output.

In addition to Stephane's suggestions, you can also get control of
your left-side by using "coproc".  This creates an actual job table
entry that you can manipulate.

zsh% coproc { echo foo; sleep 3; echo err >&2 }; head -n 1 <&p; kill %+
[1] 53747
foo
zsh%
[1]  + terminated  { echo foo; sleep 3; echo err >&2; }
zsh%

If you're going to kill the right-side with an interrupt or other
signal, you'll have to arrange to trap that so that the subsequent
kill isn't also skipped.  Also in practice you want something more
specific than "kill %+" which could kill the wrong job if you have
multiple backgrounded jobs and the coproc exits before the kill
occurs.

  parent reply	other threads:[~2019-06-29 16:18 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-28 11:04 Vincent Lefevre
2019-06-28 11:38 ` Vincent Lefevre
2019-06-29 16:17 ` Bart Schaefer [this message]
2019-07-06 23:55   ` Vincent Lefevre
2019-07-07  4:54     ` Bart Schaefer
2019-07-09 10:08       ` Vincent Lefevre
2019-07-09 10:54         ` Vincent Lefevre
2019-07-29 15:23 ` Vincent Lefevre
2019-07-29 15:54   ` Bart Schaefer
2019-07-29 20:48     ` Vincent Lefevre
2019-07-30  0:00       ` Bart Schaefer
2019-07-30  0:17         ` Vincent Lefevre
     [not found] <20190628110430.GA13790__36317.6205357135$1561719956$gmane$org@zira.vinc17.org>
2019-06-28 18:41 ` Stephane Chazelas
2019-06-29  1:24   ` Vincent Lefevre
2019-06-29 15:30     ` Stephane Chazelas
2019-07-06 23:49       ` Vincent Lefevre
2019-07-29 23:08         ` Vincent Lefevre
2019-07-29 23:15           ` Vincent Lefevre
2019-07-29 23:42             ` Bart Schaefer
2019-07-30  0:40               ` Vincent Lefevre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAH+w=7bUROc+9idB-K7ja_mO6BfNAnj0Hq+gUs1678p3FDE9Gg@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).