diff options
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/shell/hush.c b/shell/hush.c index 8e95a26..c777001 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -5075,7 +5075,6 @@ static struct pipe *parse_stream(char **pstring, debug_printf_parse("parse_stream return %p\n", pi); return pi; } - nommu_addchr(&ctx.as_string, ch); /* Handle "'" and "\" first, as they won't play nice with * i_peek_and_eat_bkslash_nl() anyway: @@ -5085,6 +5084,28 @@ static struct pipe *parse_stream(char **pstring, * ' * would break. */ + if (ch == '\\') { + ch = i_getch(input); + if (ch == '\n') + continue; /* drop \<newline>, get next char */ + nommu_addchr(&ctx.as_string, '\\'); + o_addchr(&ctx.word, '\\'); + if (ch == EOF) { + /* Testcase: eval 'echo Ok\' */ + /* bash-4.3.43 was removing backslash, + * but 4.4.19 retains it, most other shells too + */ + continue; /* get next char */ + } + /* Example: echo Hello \2>file + * we need to know that word 2 is quoted + */ + ctx.word.has_quoted_part = 1; + nommu_addchr(&ctx.as_string, ch); + o_addchr(&ctx.word, ch); + continue; /* get next char */ + } + nommu_addchr(&ctx.as_string, ch); if (ch == '\'') { ctx.word.has_quoted_part = 1; next = i_getch(input); @@ -5110,27 +5131,6 @@ static struct pipe *parse_stream(char **pstring, } continue; /* get next char */ } - if (ch == '\\') { - /*nommu_addchr(&ctx.as_string, '\\'); - already done */ - o_addchr(&ctx.word, '\\'); - ch = i_getch(input); - if (ch == EOF) { - /* Testcase: eval 'echo Ok\' */ - -#if 0 /* bash-4.3.43 was removing backslash, but 4.4.19 retains it, most other shells too */ - /* Remove trailing '\' from ctx.as_string */ - ctx.as_string.data[--ctx.as_string.length] = '\0'; -#endif - continue; /* get next char */ - } - /* Example: echo Hello \2>file - * we need to know that word 2 is quoted - */ - ctx.word.has_quoted_part = 1; - nommu_addchr(&ctx.as_string, ch); - o_addchr(&ctx.word, ch); - continue; /* get next char */ - } next = '\0'; if (ch != '\n') |