Package: zsh
Version: 5.8-6+deb11u1
Severity: normal

zsh doesn't correctly set its idea of the current job if a job consists
of a shell function that got suspended after it was started.  This is
the same condition that gives rise to Bug#1030606.  In the example
below I'm using a zsh with the patch that I supplied for that bug.
In a zsh without that patch the bug still occurs in the same way, but
the job status reporting is messed up, making it more difficult to see
what's happening.  Here's what the bug looks like:

% t0 () { sleep 1000; }
% t0
^Zzsh: suspended  t0
% sleep 2000
^Z
zsh: suspended  sleep 2000
% jobs
[1]  - suspended (signal)  t0
[3]  + suspended  sleep 2000
% fg %1
[1]  - continued  t0
^Zzsh: running    t0
% jobs
[1]  - running    t0
[3]  + suspended  sleep 2000
%

Observe that in the final "jobs" listing the current job, marked with "+",
is the "sleep 2000" job, even though the job most recently active was the
"t0" job.  By contrast, here's what correct job control looks like:

% sleep 1000
^Z
zsh: suspended  sleep 1000
% sleep 2000
^Z
zsh: suspended  sleep 2000
% jobs
[1]  - suspended  sleep 1000
[2]  + suspended  sleep 2000
% fg %1
[1]  - continued  sleep 1000
^Z
zsh: suspended  sleep 1000
% jobs
[1]  + suspended  sleep 1000
[2]  - suspended  sleep 2000
%

Getting the current job wrong leads to the previous job (marked with "-")
also going wrong, and it generally impedes the use of these concepts
for efficient job control.  I use the commands "fg" (foregrounding the
current job) and "%-" (foregrounding the previous job) all the time,
and I'm thus heavily affected by this bug.

-zefram

Reply via email to