Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: problem with 'ls | less' shell function
On Mon, Oct 17, 2022 at 05:36:20PM +0200, Thomas Klausner wrote:
> On Mon, Oct 17, 2022 at 04:50:20PM +0200, Mikael Magnusson wrote:
> > On 10/17/22, Thomas Klausner <wiz@xxxxxxxxxxx> wrote:
> > > Hi!
> > >
> > > I recently noticed a problem in zsh 5.9 (as built from pkgsrc) on
> > > NetBSD 9.99.100. Since I didn't notice it before it could be related
> > > to a change in NetBSD (I'm following the latest version), but I've
> > > been told that the issue can be reproduced on Ubuntu 19.04 and FreeBSD
> > > 13.1 too; but not in zsh 5.8.1, nor in most other shells though.
> > >
> > > The discussion on the NetBSD mailing list can be read in this thread:
> > > https://mail-index.netbsd.org/current-users/2022/10/12/msg043076.html
> > > but I'll summarize the issue I see in zsh here.
> > >
> > > I have a shell function I've been using for ages:
> > >
> > > dir() { ls -al "$@" | less; }
> > >
> > > Recently, when I tried suspending this with CTRL-Z and then resuming
> > > it with 'fg', I get:
> > >
> > > $ dir
> > > (CTRL-Z)
> > > zsh: done ls -al "$@" |
> > > zsh: suspended
> > > $ fg
> > > [1] + done ls -al "$@" |
> > > continued
> > > zsh: done ls -al "$@" |
> > > zsh: suspended (tty output)
> > > zsh: done ls -al "$@" |
> > > zsh: suspended (tty output)
> > >
> > > The same thing works in NetBSD's ksh:
> > >
> > > $ fg
> > > ls -al "$@" | less
> > > (CTRL-Z)
> > > [1] + Done ls -al "$@" |
> > > Stopped less
> > >
> > > or in bash
> > >
> > > $ fg
> > > ls -al "$@" | less
> > > (CTRL-Z)
> > >
> > > [1]+ Stopped ls -al "$@" | less
> > >
> > > If I use '/bin/ls' in the shell function instead of 'ls', it works
> > > fine.
> > >
> > > Any ideas what the issue could be?
> >
> > The last bit implies that 'ls' is an alias or function, can you check
> > the output of 'which ls'?
>
> No, it isn't:
>
> $ which ls
> /bin/ls
> $ type ls
> ls is /bin/ls
>
> Compare to
>
> $ type ll
> ll is an alias for ls -al
> $ type dir
> dir is a shell function from /home/wiz/.zshrc
>
> But I take back the statement that it works with /bin/ls in the dir
> function definition, it shows the same broken behaviour. Not sure why
> I thought it worked before, sorry for that red herring.
> Thomas
>
I think what happens is that zsh fails to correctly set the foreground
process group in `fg`. `less` is not in the foreground pgrp that's why
it immediately gets suspended by SIGTTIN after it receives SIGCONT.
In this example it is more obvious that `sleep` is not in the
foreground pgrp (confirm with ps):
$ f(){echo|sleep 60}
$ f
^Z
$ fg
^Z^Z^C^C^C^C^C^\
15bf8ace168a86d0fae90b10e9f706baddd4c0bf is the first bad commit
50134: Tweak process group handling to prevent unkillable pipelines
--
zsugabubus
Messages sorted by:
Reverse Date,
Date,
Thread,
Author