hush: fix "cmd & <newline>" problem
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 18 Jan 2011 16:30:07 +0000 (17:30 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 18 Jan 2011 16:30:07 +0000 (17:30 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c

index 6970c50c46367058b0e4722efc93ce3ca235c3f3..3581ba11987155383d956eff49c799e82071e6cd 100644 (file)
@@ -4141,15 +4141,26 @@ static struct pipe *parse_stream(char **pstring,
                                 && dest.length == 0 && !dest.has_quoted_part
                                ) {
                                        /* This newline can be ignored. But...
-                                        * without the below check, interactive shell
-                                        * will ignore even lines with bare <newline>,
-                                        * and show the continuation prompt:
+                                        * Without check #1, interactive shell
+                                        * ignores even bare <newline>,
+                                        * and shows the continuation prompt:
                                         * ps1_prompt$ <enter>
-                                        * ps2> _   <=== wrong prompt, should be ps1
+                                        * ps2> _   <=== wrong, should be ps1
+                                        * Without check #2, "cmd & <newline>"
+                                        * is similarly mistreated.
+                                        * (BTW, this makes "cmd & cmd"
+                                        * and "cmd && cmd" non-orthogonal.
+                                        * Really, ask yourself, why
+                                        * "cmd && <newline>" doesn't start
+                                        * cmd but waits for more input?
+                                        * No reason...)
                                         */
                                        struct pipe *pi = ctx.list_head;
-                                       if (pi->num_cmds != 0)
+                                       if (pi->num_cmds != 0       /* check #1 */
+                                        && pi->followup != PIPE_BG /* check #2 */
+                                       ) {
                                                continue;
+                                       }
                                }
                                /* Treat newline as a command separator. */
                                done_pipe(&ctx, PIPE_SEQ);