diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/jobs.c | 13 | ||||
-rw-r--r-- | Src/options.c | 1 | ||||
-rw-r--r-- | Src/zsh.h | 1 |
3 files changed, 12 insertions, 3 deletions
diff --git a/Src/jobs.c b/Src/jobs.c index e1b24b2c9..b9d7a84cc 100644 --- a/Src/jobs.c +++ b/Src/jobs.c @@ -508,15 +508,22 @@ update_job(Job jn) jn->stat |= (somestopped) ? STAT_CHANGED | STAT_STOPPED : STAT_CHANGED | STAT_DONE; if (job == thisjob && (jn->stat & STAT_DONE)) { - int i; + int i, newlastval = 0; Process p; - for (p = jn->procs, i = 0; p && i < MAX_PIPESTATS; p = p->next, i++) + for (p = jn->procs, i = 0; p && i < MAX_PIPESTATS; p = p->next, i++) { pipestats[i] = ((WIFSIGNALED(p->status)) ? 0200 | WTERMSIG(p->status) : WEXITSTATUS(p->status)); - if ((jn->stat & STAT_CURSH) && i < MAX_PIPESTATS) + if (pipestats[i]) + newlastval = pipestats[i]; + } + if ((jn->stat & STAT_CURSH) && i < MAX_PIPESTATS) { pipestats[i++] = lastval; + if (!lastval && isset(PIPEFAIL)) + lastval = newlastval; + } else if (isset(PIPEFAIL)) + lastval= newlastval; numpipestats = i; } if (!inforeground && diff --git a/Src/options.c b/Src/options.c index ad869b253..ce73d9901 100644 --- a/Src/options.c +++ b/Src/options.c @@ -205,6 +205,7 @@ static struct optname optns[] = { {{NULL, "overstrike", 0}, OVERSTRIKE}, {{NULL, "pathdirs", OPT_EMULATE}, PATHDIRS}, {{NULL, "pathscript", OPT_EMULATE|OPT_BOURNE}, PATHSCRIPT}, +{{NULL, "pipefail", OPT_EMULATE}, PIPEFAIL}, {{NULL, "posixaliases", OPT_EMULATE|OPT_BOURNE}, POSIXALIASES}, {{NULL, "posixbuiltins", OPT_EMULATE|OPT_BOURNE}, POSIXBUILTINS}, {{NULL, "posixcd", OPT_EMULATE|OPT_BOURNE}, POSIXCD}, diff --git a/Src/zsh.h b/Src/zsh.h index e6f0f65db..a46898d7d 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -2121,6 +2121,7 @@ enum { OVERSTRIKE, PATHDIRS, PATHSCRIPT, + PIPEFAIL, POSIXALIASES, POSIXBUILTINS, POSIXCD, |