hush: fix exit code propagation from cmd
. +45 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
a7ccdeef39
commit
00243b0a1a
15
shell/hush.c
15
shell/hush.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 $?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user