Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
curjob in sub-shells?
- X-seq: zsh-workers 54581
- From: dana <dana@xxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: curjob in sub-shells?
- Date: Wed, 20 May 2026 01:06:40 -0500
- Archived-at: <https://zsh.org/workers/54581>
- Feedback-id: i9be146f9:Fastmail
- List-id: <zsh-workers.zsh.org>
i was writing some job tests and i noticed this:
% zsh -fc '( sleep 3 &; disown; jobs ); :'
zsh:disown:1: no current job
[2] running sleep 3
this is because disown without an argument operates on curjob, and
spawnjob() doesn't update curjob in sub-shells. (for the same reason,
you can't use `kill %%` etc. but `disown %2` or `kill %2` would work)
i tried changing that and it seemed mostly ok, but it caused a test in
W03 to fail. it has this comment:
# $jobstates refers to a job started in the main shell unless
# one has been started in the subshell. In the latter case,
# the subshell has no job control so the job is not marked as current.
i don't understand. what would be the negative consequences of marking
the job as current in a sub-shell?
fwiw: dash, bash, and ksh93 all show the job as current. disown and
`kill %%` work as expected in bash, with or without monitor. `kill %%`
works in ksh93; i'm not sure if disown does because ksh93 disown doesn't
actually remove jobs from the job table. neither works in dash
below is the change i made
dana
diff --git a/Src/jobs.c b/Src/jobs.c
index 2ce5f8254..10ce965a3 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1896,21 +1896,19 @@ spawnjob(void)
Process pn;
DPUTS(thisjob == -1, "No valid job in spawnjob.");
- /* if we are not in a subshell */
- if (!subsh) {
- if (curjob == -1 || !(jobtab[curjob].stat & STAT_STOPPED)) {
- curjob = thisjob;
- setprevjob();
- } else if (prevjob == -1 || !(jobtab[prevjob].stat & STAT_STOPPED))
- prevjob = thisjob;
- if (jobbing && jobtab[thisjob].procs) {
- FILE *fout = shout ? shout : stdout;
- fprintf(fout, "[%d]", thisjob);
- for (pn = jobtab[thisjob].procs; pn; pn = pn->next)
- fprintf(fout, " %ld", (long) pn->pid);
- fprintf(fout, "\n");
- fflush(fout);
- }
+ if (curjob == -1 || !(jobtab[curjob].stat & STAT_STOPPED)) {
+ curjob = thisjob;
+ setprevjob();
+ } else if (prevjob == -1 || !(jobtab[prevjob].stat & STAT_STOPPED))
+ prevjob = thisjob;
+
+ if (!subsh && jobbing && jobtab[thisjob].procs) {
+ FILE *fout = shout ? shout : stdout;
+ fprintf(fout, "[%d]", thisjob);
+ for (pn = jobtab[thisjob].procs; pn; pn = pn->next)
+ fprintf(fout, " %ld", (long) pn->pid);
+ fprintf(fout, "\n");
+ fflush(fout);
}
if (!hasprocs(thisjob))
deletejob(jobtab + thisjob, 0);
Messages sorted by:
Reverse Date,
Date,
Thread,
Author