Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH v2] Fix jobs -p to be POSIX compliant



In Debian the following bug was reported a couple of year ago and
someone re-raised it:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=346162

POSIX says that with "jobs -p", only the PID is output, whereas zsh
outputs full information.

There is discussion in the bug regarding POSIX_BUILTINS and refers to
workers/21366. The latter is interesting because it refers to setopt
long_list_jobs. I would want to argue that jobs -p should only show the
PID regardless of that setting and POSIX_BUILTINS. jobs has the -l
option, where the full line is displayed. From that point it doesn't
make a whole lot of sense to have jobs -p do the same thing. From a UI
standpoint I think it is more logical to let jobs -l do a long listing
and jobs -p only show the pid.

Than there is the issue where its argued that zsh shows the group pid
and not the actual pid of the process that is running. I looked at the
output of bash and with this patch zsh and bash act similar. They both
show the pid of the command group:

On bash:

$ ( sleep 20 && echo foo) & sleep 5 &
$ jobs -p && jobs -l
255028
255029
[1]- 255028 Running                 ( sleep 20 && echo foo ) &
[2]+ 255029 Done                    sleep 5

On zsh with this patch:

$ ( sleep 20 && echo foo) & sleep 5 &
$ jobs -l && jobs -p
[1] 255065
[2] 255066
[1]  - 255065 running    ( sleep 20 && echo foo; )
[2]  + 255066 running    sleep 5
255065
255066

Signed-off-by: Wesley Schwengle <wesleys@xxxxxxxxxxxxxxx>
---
 Src/jobs.c        | 16 ++++++----------
 Test/W02jobs.ztst |  2 +-
 2 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/Src/jobs.c b/Src/jobs.c
index 118c5e61b..14f1be831 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1209,6 +1209,11 @@ printjob(Job jn, int lng, int synch)
 	    putc('\n', fout);
 	}
 	for (pn = jn->procs; pn;) {
+	    if (lng & 2) {
+		fprintf(fout, "%ld\n", (long) jn->gleader);
+		doneprint = 1;
+		break;
+	    }
 	    len2 = (thisfmt ? 5 : 10) + len;	/* 2 spaces */
 	    if (lng & 3)
 		qn = pn->next;
@@ -1235,16 +1240,7 @@ printjob(Job jn, int lng, int synch)
 		    fprintf(fout, "zsh: ");
 		if (lng & 1)
 		    fprintf(fout, "%ld ", (long) pn->pid);
-		else if (lng & 2) {
-		    pid_t x = jn->gleader;
-
-		    fprintf(fout, "%ld ", (long) x);
-		    do
-			skip++;
-		    while ((x /= 10));
-		    skip++;
-		    lng &= ~3;
-		} else
+		else
 		    fprintf(fout, "%*s", skip, "");
 		if (pn->status == SP_RUNNING) {
 		    if (!conted)
diff --git a/Test/W02jobs.ztst b/Test/W02jobs.ztst
index d52888dd9..11bbdbf43 100644
--- a/Test/W02jobs.ztst
+++ b/Test/W02jobs.ztst
@@ -128,7 +128,7 @@
 0:`jobs -l` and `jobs -p` with running job
 *>\[1] [0-9]##
 *>\[1]  + [0-9]## running*sleep*
-*>\[1]  + [0-9]## running*sleep*
+*>[0-9]##
 *>zsh:*SIGHUPed*
 
   zpty_start
-- 
2.42.0.1140.gf01f4dc781





Messages sorted by: Reverse Date, Date, Thread, Author