summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/jobs.c13
-rw-r--r--Src/options.c1
-rw-r--r--Src/zsh.h1
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,