mirror of
https://github.com/ipxe/ipxe
synced 2025-12-19 11:00:27 +03:00
[cmdline] Match user expectations for &&, ||, goto, and exit
The && and || operators should be left-associative, since that is how
they are treated in most other languages (including C and Unix
shell). For example, in the command:
dhcp net0 && goto dhcp_ok || echo No DHCP on net0
if the "dhcp net0" fails then the "echo" should be executed.
After an "exit" or a successful "goto", further commands on the same
line should never be executed. For example:
goto somewhere && echo This should never be printed
exit 0 && echo This should never be printed
exit 1 && echo This should never be printed
An "exit" should cause the current shell or script to terminate and
return the specified exit status to its caller. For example:
chain test.ipxe && echo Success || echo Failure
[in test.ipxe]
#!ipxe
exit 0
should echo "Success".
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -34,6 +34,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||
#include <ipxe/command.h>
|
||||
#include <ipxe/parseopt.h>
|
||||
#include <ipxe/image.h>
|
||||
#include <ipxe/shell.h>
|
||||
|
||||
struct image_type script_image_type __image_type ( PROBE_NORMAL );
|
||||
|
||||
@@ -106,13 +107,8 @@ static int process_script ( int ( * process_line ) ( const char *line ),
|
||||
*/
|
||||
static int terminate_on_exit_or_failure ( int rc ) {
|
||||
|
||||
/* Check and consume exit flag */
|
||||
if ( shell_exit ) {
|
||||
shell_exit = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return ( rc != 0 );
|
||||
return ( shell_stopped ( SHELL_STOP_COMMAND_SEQUENCE ) ||
|
||||
( rc != 0 ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -292,6 +288,9 @@ static int goto_exec ( int argc, char **argv ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Terminate processing of current command */
|
||||
shell_stop ( SHELL_STOP_COMMAND );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user