hush: fix comment parsing in cmd, closes 10421

function                                             old     new   delta
parse_stream                                        2692    2690      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-10-22 15:55:48 +02:00
parent 045327a418
commit 25f3b737dc
5 changed files with 47 additions and 4 deletions

View File

@ -0,0 +1,4 @@
Ok1
Ok2
Ok5
Ok6

View File

@ -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
)

View File

@ -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;

View File

@ -0,0 +1,4 @@
Ok1
Ok2
Ok5
Ok6

View File

@ -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
)