diff options
-rw-r--r-- | shell/ash.c | 2 | ||||
-rw-r--r-- | shell/ash_test/ash-parsing/bkslash_eof1.right | 1 | ||||
-rwxr-xr-x | shell/ash_test/ash-parsing/bkslash_eof1.tests | 1 | ||||
-rw-r--r-- | shell/ash_test/ash-redir/redir_exec1.right | 2 | ||||
-rw-r--r-- | shell/hush.c | 22 | ||||
-rw-r--r-- | shell/hush_test/hush-parsing/bkslash_eof1.right | 2 |
6 files changed, 22 insertions, 8 deletions
diff --git a/shell/ash.c b/shell/ash.c index 713219b6e..6f8bc9042 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -203,7 +203,7 @@ * TODO: * singleword+noglob expansion: * v='a b'; [[ $v = 'a b' ]]; echo 0:$? - * [[ /bin/* ]]; echo 0:$? + * [[ /bin/n* ]]; echo 0:$? * -a/-o are not AND/OR ops! (they are just strings) * quoting needs to be considered (-f is an operator, "-f" and ""-f are not; etc) * = is glob match operator, not equality operator: STR = GLOB diff --git a/shell/ash_test/ash-parsing/bkslash_eof1.right b/shell/ash_test/ash-parsing/bkslash_eof1.right new file mode 100644 index 000000000..6c6df0b0c --- /dev/null +++ b/shell/ash_test/ash-parsing/bkslash_eof1.right @@ -0,0 +1 @@ +ok\ diff --git a/shell/ash_test/ash-parsing/bkslash_eof1.tests b/shell/ash_test/ash-parsing/bkslash_eof1.tests new file mode 100755 index 000000000..97629cb13 --- /dev/null +++ b/shell/ash_test/ash-parsing/bkslash_eof1.tests @@ -0,0 +1 @@ +eval 'echo ok\' diff --git a/shell/ash_test/ash-redir/redir_exec1.right b/shell/ash_test/ash-redir/redir_exec1.right index d4393d10c..c98455bf5 100644 --- a/shell/ash_test/ash-redir/redir_exec1.right +++ b/shell/ash_test/ash-redir/redir_exec1.right @@ -1,2 +1,2 @@ -redir_exec1.tests: line 1: can't create /cant/be/created: nonexistent directory +./redir_exec1.tests: line 1: can't create /cant/be/created: nonexistent directory First diff --git a/shell/hush.c b/shell/hush.c index 3afb70cb0..523fc1a31 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -83,7 +83,7 @@ * Status of [[ support: * [[ args ]] are CMD_SINGLEWORD_NOGLOB: * v='a b'; [[ $v = 'a b' ]]; echo 0:$? - * [[ /bin/* ]]; echo 0:$? + * [[ /bin/n* ]]; echo 0:$? * TODO: * &&/|| are AND/OR ops, -a/-o are not * quoting needs to be considered (-f is an operator, "-f" and ""-f are not; etc) @@ -1426,8 +1426,19 @@ static char *unbackslash(char *src) { char *dst = src = strchrnul(src, '\\'); while (1) { - if (*src == '\\') + if (*src == '\\') { src++; + if (*src != '\0') { + /* \x -> x */ + *dst++ = *src++; + continue; + } + /* else: "\<nul>". Do not delete this backslash. + * Testcase: eval 'echo ok\' + */ + *dst++ = '\\'; + /* fallthrough */ + } if ((*dst++ = *src++) == '\0') break; } @@ -5392,16 +5403,17 @@ static struct pipe *parse_stream(char **pstring, continue; /* get next char */ case '\\': /*nommu_addchr(&ctx.as_string, '\\'); - already done */ + o_addchr(&ctx.word, '\\'); ch = i_getch(input); if (ch == EOF) { - /* Ignore this '\'. Testcase: eval 'echo Ok\' */ -#if !BB_MMU + /* 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 */ } - o_addchr(&ctx.word, '\\'); /* Example: echo Hello \2>file * we need to know that word 2 is quoted */ diff --git a/shell/hush_test/hush-parsing/bkslash_eof1.right b/shell/hush_test/hush-parsing/bkslash_eof1.right index 9766475a4..6c6df0b0c 100644 --- a/shell/hush_test/hush-parsing/bkslash_eof1.right +++ b/shell/hush_test/hush-parsing/bkslash_eof1.right @@ -1 +1 @@ -ok +ok\ |