hush: fix handling of "cmd && &"

function                                             old     new   delta
done_pipe                                            213     231     +18

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2021-06-15 18:12:13 +02:00
parent 1b7a9b68d0
commit 83a4967e50

View File

@ -3696,9 +3696,10 @@ static void debug_print_tree(struct pipe *pi, int lvl)
pin = 0; pin = 0;
while (pi) { while (pi) {
fdprintf(2, "%*spipe %d %sres_word=%s followup=%d %s\n", fdprintf(2, "%*spipe %d #cmds:%d %sres_word=%s followup=%d %s\n",
lvl*2, "", lvl*2, "",
pin, pin,
pi->num_cmds,
(IF_HAS_KEYWORDS(pi->pi_inverted ? "! " :) ""), (IF_HAS_KEYWORDS(pi->pi_inverted ? "! " :) ""),
RES[pi->res_word], RES[pi->res_word],
pi->followup, PIPE[pi->followup] pi->followup, PIPE[pi->followup]
@ -3841,6 +3842,9 @@ static void done_pipe(struct parse_context *ctx, pipe_style type)
#endif #endif
/* Replace all pipes in ctx with one newly created */ /* Replace all pipes in ctx with one newly created */
ctx->list_head = ctx->pipe = pi; ctx->list_head = ctx->pipe = pi;
/* for cases like "cmd && &", do not be tricked by last command
* being null - the entire {...} & is NOT null! */
not_null = 1;
} else { } else {
no_conv: no_conv:
ctx->pipe->followup = type; ctx->pipe->followup = type;