hush: fix exit code propagation from cmd. +45 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-11-16 02:00:03 +01:00
parent a7ccdeef39
commit 00243b0a1a
3 changed files with 17 additions and 10 deletions

View File

@ -3904,7 +3904,7 @@ static NOINLINE int run_pipe(struct pipe *pi)
/* if someone gives us an empty string: `cmd with empty output` */ /* if someone gives us an empty string: `cmd with empty output` */
if (!argv_expanded[0]) { if (!argv_expanded[0]) {
debug_leave(); debug_leave();
return 0; // or G.last_exitcode? see emptytick.tests return G.last_exitcode;
} }
x = find_builtin(argv_expanded[0]); x = find_builtin(argv_expanded[0]);
@ -6380,15 +6380,26 @@ static struct pipe *parse_stream(char **pstring,
*/ */
static void parse_and_run_stream(struct in_str *inp, int end_trigger) static void parse_and_run_stream(struct in_str *inp, int end_trigger)
{ {
/* Why we need empty flag?
* An obscure corner case "false; ``; echo $?":
* empty command in `` should still set $? to 0.
* But we can't just set $? to 0 at the start,
* this breaks "false; echo `echo $?`" case.
*/
bool empty = 1;
while (1) { while (1) {
struct pipe *pipe_list; struct pipe *pipe_list;
pipe_list = parse_stream(NULL, inp, end_trigger); pipe_list = parse_stream(NULL, inp, end_trigger);
if (!pipe_list) /* EOF */ if (!pipe_list) { /* EOF */
if (empty)
G.last_exitcode = 0;
break; break;
}
debug_print_tree(pipe_list, 0); debug_print_tree(pipe_list, 0);
debug_printf_exec("parse_and_run_stream: run_and_free_list\n"); debug_printf_exec("parse_and_run_stream: run_and_free_list\n");
run_and_free_list(pipe_list); run_and_free_list(pipe_list);
empty = 0;
} }
} }

View File

@ -1,17 +1,17 @@
0 0
0 0
hush: can't execute '': No such file or directory hush: can't execute '': No such file or directory
0 127
hush: can't execute '': No such file or directory hush: can't execute '': No such file or directory
0 127
0 0
0 0
0 0
0 0
hush: can't execute '': No such file or directory hush: can't execute '': No such file or directory
0 127
hush: can't execute '': No such file or directory hush: can't execute '': No such file or directory
0 127
0 0
0 0
hush: can't execute '': No such file or directory hush: can't execute '': No such file or directory

View File

@ -1,17 +1,13 @@
true; ``; echo $? true; ``; echo $?
false; ``; echo $? false; ``; echo $?
# UNFIXED BUG. bash sets $? to 127:
true; `""`; echo $? true; `""`; echo $?
# bash sets $? to 127:
false; `""`; echo $? false; `""`; echo $?
true; ` `; echo $? true; ` `; echo $?
false; ` `; echo $? false; ` `; echo $?
true; $(); echo $? true; $(); echo $?
false; $(); echo $? false; $(); echo $?
# bash sets $? to 127:
true; $(""); echo $? true; $(""); echo $?
# bash sets $? to 127:
false; $(""); echo $? false; $(""); echo $?
true; $( ); echo $? true; $( ); echo $?
false; $( ); echo $? false; $( ); echo $?