hush: fix "if false; then...fi" exitcode;
trim "keyword"-less hush by 10 bytes
This commit is contained in:
parent
4ed67dd3d5
commit
0e15138c03
13
shell/hush.c
13
shell/hush.c
@ -3038,8 +3038,10 @@ static int run_list(struct pipe *pi)
|
|||||||
#else
|
#else
|
||||||
enum { cond_code = 0 };
|
enum { cond_code = 0 };
|
||||||
#endif
|
#endif
|
||||||
|
#if HAS_KEYWORDS
|
||||||
smallint rword; /* enum reserved_style */
|
smallint rword; /* enum reserved_style */
|
||||||
smallint last_rword; /* ditto */
|
smallint last_rword; /* ditto */
|
||||||
|
#endif
|
||||||
|
|
||||||
debug_printf_exec("run_list start lvl %d\n", G.run_list_level + 1);
|
debug_printf_exec("run_list start lvl %d\n", G.run_list_level + 1);
|
||||||
|
|
||||||
@ -3118,10 +3120,12 @@ static int run_list(struct pipe *pi)
|
|||||||
}
|
}
|
||||||
#endif /* JOB */
|
#endif /* JOB */
|
||||||
|
|
||||||
rcode = G.last_return_code;
|
#if HAS_KEYWORDS
|
||||||
rword = RES_NONE;
|
rword = RES_NONE;
|
||||||
last_rword = RES_XXXX;
|
last_rword = RES_XXXX;
|
||||||
|
#endif
|
||||||
last_followup = PIPE_SEQ;
|
last_followup = PIPE_SEQ;
|
||||||
|
rcode = G.last_return_code;
|
||||||
|
|
||||||
/* Go through list of pipes, (maybe) executing them. */
|
/* Go through list of pipes, (maybe) executing them. */
|
||||||
for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) {
|
for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) {
|
||||||
@ -3129,7 +3133,6 @@ static int run_list(struct pipe *pi)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
IF_HAS_KEYWORDS(rword = pi->res_word;)
|
IF_HAS_KEYWORDS(rword = pi->res_word;)
|
||||||
IF_HAS_NO_KEYWORDS(rword = RES_NONE;)
|
|
||||||
debug_printf_exec(": rword=%d cond_code=%d last_rword=%d\n",
|
debug_printf_exec(": rword=%d cond_code=%d last_rword=%d\n",
|
||||||
rword, cond_code, last_rword);
|
rword, cond_code, last_rword);
|
||||||
#if ENABLE_HUSH_LOOPS
|
#if ENABLE_HUSH_LOOPS
|
||||||
@ -3142,7 +3145,7 @@ static int run_list(struct pipe *pi)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Still in the same "if...", "then..." or "do..." branch? */
|
/* Still in the same "if...", "then..." or "do..." branch? */
|
||||||
if (rword == last_rword) {
|
if (IF_HAS_KEYWORDS(rword == last_rword &&) 1) {
|
||||||
if ((rcode == 0 && last_followup == PIPE_OR)
|
if ((rcode == 0 && last_followup == PIPE_OR)
|
||||||
|| (rcode != 0 && last_followup == PIPE_AND)
|
|| (rcode != 0 && last_followup == PIPE_AND)
|
||||||
) {
|
) {
|
||||||
@ -3154,10 +3157,12 @@ static int run_list(struct pipe *pi)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_followup = pi->followup;
|
last_followup = pi->followup;
|
||||||
last_rword = rword;
|
IF_HAS_KEYWORDS(last_rword = rword;)
|
||||||
#if ENABLE_HUSH_IF
|
#if ENABLE_HUSH_IF
|
||||||
if (cond_code) {
|
if (cond_code) {
|
||||||
if (rword == RES_THEN) {
|
if (rword == RES_THEN) {
|
||||||
|
/* if false; then ... fi has exitcode 0! */
|
||||||
|
G.last_return_code = rcode = EXIT_SUCCESS;
|
||||||
/* "if <false> THEN cmd": skip cmd */
|
/* "if <false> THEN cmd": skip cmd */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
1
shell/hush_test/hush-misc/if_false_exitcode.right
Normal file
1
shell/hush_test/hush-misc/if_false_exitcode.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
Ok:0
|
2
shell/hush_test/hush-misc/if_false_exitcode.tests
Executable file
2
shell/hush_test/hush-misc/if_false_exitcode.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
if false; then echo Bad; fi
|
||||||
|
echo Ok:$?
|
Loading…
x
Reference in New Issue
Block a user