hush: fix comment parsing in `cmd`, closes 10421
No binary (build failed)
—
(log yok)
| @@ -0,0 +1,4 @@ | |
| + | Ok1 |
| + | Ok2 |
| + | Ok5 |
| + | Ok6 |
| @@ -0,0 +1,13 @@ | |
| + | echo "`echo Ok1 #comment is ignored`" |
| + | echo `echo Ok2 #comment is ignored` |
| + | # |
| + | # Surprisingly, bash does not handle comments in $() |
| + | # the same way as in ``. "#" causes the rest of the line, _including_ )", |
| + | # to be ignored. These lines would cause an error: |
| + | #echo "$(echo Ok3 #comment is ignored)" |
| + | #echo $(echo Ok4 #comment is ignored) |
| + | # |
| + | echo "$(echo Ok5 #comment is ignored |
| + | )" |
| + | echo $(echo Ok6 #comment is ignored |
| + | ) |
| @@ -5140,14 +5140,23 @@ static struct pipe *parse_stream(char **pstring, | |
| case '#': | |
| if (dest.length == 0 && !dest.has_quoted_part) { | |
| /* skip "#comment" */ | |
| + | /* note: we do not add it to &ctx.as_string */ |
| + | /* TODO: in bash: |
| + | * comment inside $() goes to the next \n, even inside quoted string (!): |
| + | * cmd "$(cmd2 #comment)" - syntax error |
| + | * cmd "`cmd2 #comment`" - ok |
| + | * We accept both (comment ends where command subst ends, in both cases). |
| + | */ |
| while (1) { | |
| ch = i_peek(input); | |
| - | if (ch == EOF || ch == '\n') |
| + | if (ch == '\n') { |
| + | nommu_addchr(&ctx.as_string, '\n'); |
| + | break; |
| + | } |
| + | ch = i_getch(input); |
| + | if (ch == EOF) |
| break; | |
| - | i_getch(input); |
| - | /* note: we do not add it to &ctx.as_string */ |
| } | |
| - | nommu_addchr(&ctx.as_string, '\n'); |
| continue; /* back to top of while (1) */ | |
| } | |
| break; | |
| @@ -0,0 +1,4 @@ | |
| + | Ok1 |
| + | Ok2 |
| + | Ok5 |
| + | Ok6 |
| @@ -0,0 +1,13 @@ | |
| + | echo "`echo Ok1 #comment is ignored`" |
| + | echo `echo Ok2 #comment is ignored` |
| + | # |
| + | # Surprisingly, bash does not handle comments in $() |
| + | # the same way as in ``. "#" causes the rest of the line, _including_ )", |
| + | # to be ignored. These lines would cause an error: |
| + | #echo "$(echo Ok3 #comment is ignored)" |
| + | #echo $(echo Ok4 #comment is ignored) |
| + | # |
| + | echo "$(echo Ok5 #comment is ignored |
| + | )" |
| + | echo $(echo Ok6 #comment is ignored |
| + | ) |