bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Terminal stop when a group of pipelines is piped to a pager


From: Pierre Gaston
Subject: Re: Terminal stop when a group of pipelines is piped to a pager
Date: Wed, 28 Sep 2016 11:09:56 +0300



On Wed, Sep 28, 2016 at 10:35 AM, Abhijit Dasgupta <address@hidden> wrote:
Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu' -DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H   -I.  -I../. -I.././include -I.././lib  -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall
uname output: Linux rho 3.16.0-38-generic #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Machine Type: x86_64-pc-linux-gnu

Bash Version: 4.3
Patch Level: 11
Release Status: release

Description:

  The following stopping issue is seen in recent bash versions:

    $ { cmd_a; cmd_b | cmd_c; } | pager_prog

    [1]+  Stopped                  { cmd_a; cmd_b | cmd_c; } | pager_prog

  What is seen:  If a group of commands (in the above form) has its output
  piped to a pager program (e.g. more, less, etc), then they get stopped
  (by a SIGTTIN/SIGTTOU signal, while pager_prog accesses the tty).  This
  happens if the first command of the group (cmd_a) is not a bash builtin
  AND a pipeline occurs later in the group (cmd_b | cmd_c).

  Puzzlingly, the issue does not arise if in the command group either the
  first command (cmd_a) is a bash builtin or if none of the later commands
  contains a pipe.

Repeat-by:

  Specific examples to reproduce/illustrate the issue:

    { /bin/echo "Users"; who | sort; } | more                # Gets stopped
    { builtin echo "Users"; who | sort; } | more          # Works fine

    { date; who | sort; } | more                     # Gets stopped
    { who | sort; date; } | more                     # Works fine

Workaround:

  The problem goes away if we enclose the individual pipelines
  within the group (or the entire group) with a sh -c '...'.

Additional notes:

- The problem is still seen if the commands are grouped using parentheses
  (subshell) instead of braces, and also when pipelined commands are
  repeated in a loop, e.g.:

    for n in 1 2 ; do cmd_a | cmd_b ; done | pager_prog

    [1]+  Stopped                  for n in 1 2;
    do
        cmd_a | cmd_b;
    done | pager_prog

- The problem is seen in all terminal types (xterm, linux console VT, etc)

- The problem is seen in bash versions 4.3.46 and 4.3.11, but not in 4.1.5.


Thanks,

Abhijit Dasgupta

I cannot reproduce with either 4.3.46 or 4.3.11,  but my system is 32bits and not 64bits.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]