diff options
author | tjr <tjr@FreeBSD.org> | 2002-06-01 01:51:42 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2002-06-01 01:51:42 +0000 |
commit | fff7a365669b964928b679402547a2c0dd3428d3 (patch) | |
tree | 27f40a0f20ad572fb62afaceac5f847f5ab44aa7 /bin | |
parent | 2e73795c55e0123f8df12dc5c840657116d08056 (diff) | |
download | FreeBSD-src-fff7a365669b964928b679402547a2c0dd3428d3.zip FreeBSD-src-fff7a365669b964928b679402547a2c0dd3428d3.tar.gz |
Support the remaining job ID formats required by SUSv3:
%+ (current job, same as %%),
%- (previous job),
%?str (job with "str" in its command name).
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/jobs.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 822500b..5cf35c9 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -518,7 +518,7 @@ STATIC struct job * getjob(char *name) { int jobno; - struct job *jp; + struct job *found, *jp; int pid; int i; @@ -539,9 +539,28 @@ currentjob: if ((jp = getcurjob(NULL)) == NULL) #if JOBS } else if (name[1] == '%' && name[2] == '\0') { goto currentjob; + } else if (name[1] == '+' && name[2] == '\0') { + goto currentjob; + } else if (name[1] == '-' && name[2] == '\0') { + if ((jp = getcurjob(NULL)) == NULL || + (jp = getcurjob(jp)) == NULL) + error("No previous job"); + return (jp); #endif + } else if (name[1] == '?') { + found = NULL; + for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) { + if (jp->used && jp->nprocs > 0 + && strstr(jp->ps[0].cmd, name + 2) != NULL) { + if (found) + error("%s: ambiguous", name); + found = jp; + } + } + if (found != NULL) + return (found); } else { - struct job *found = NULL; + found = NULL; for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) { if (jp->used && jp->nprocs > 0 && prefix(name + 1, jp->ps[0].cmd)) { |