summaryrefslogtreecommitdiff
path: root/Src/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/Src/exec.c b/Src/exec.c
index fd6f45f93..74f389a8d 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2165,7 +2165,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
LinkList redir;
wordcode code;
Wordcode beg = state->pc, varspc;
- FILE *oxtrerr = xtrerr;
+ FILE *oxtrerr = xtrerr, *newxtrerr = NULL;
doneps4 = 0;
redir = (wc_code(*state->pc) == WC_REDIR ? ecgetredirs(state) : NULL);
@@ -2675,10 +2675,10 @@ execcmd(Estate state, int input, int output, int how, int last1)
fflush(xtrerr);
if (isset(XTRACE) && xtrerr == stderr &&
(type < WC_SUBSH || type == WC_TIMED)) {
- if (!(xtrerr = fdopen(movefd(dup(fileno(stderr))), "w")))
- xtrerr = stderr;
- else
+ if ((newxtrerr = fdopen(movefd(dup(fileno(stderr))), "w"))) {
+ xtrerr = newxtrerr;
fdtable[fileno(xtrerr)] = FDT_XTRACE;
+ }
}
/* Add pipeline input/output to mnodes */
@@ -2885,6 +2885,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
if (mfds[i] && mfds[i]->ct >= 2)
closemn(mfds, i);
+ xtrerr = stderr;
if (nullexec) {
if (nullexec == 1) {
/*
@@ -3099,9 +3100,9 @@ execcmd(Estate state, int input, int output, int how, int last1)
fixfds(save);
done:
- if (xtrerr != oxtrerr) {
- fil = fileno(xtrerr);
- fclose(xtrerr);
+ if (newxtrerr) {
+ fil = fileno(newxtrerr);
+ fclose(newxtrerr);
xtrerr = oxtrerr;
zclose(fil);
}