1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 22:51:42 +02:00

30789: Add CONTINUE_ON_ERROR for old behaviour.

New behaviour is for scripts to exit on error instead of returning
to top level and executing the next command.
This commit is contained in:
Peter Stephenson 2012-11-15 21:08:15 +00:00
parent 1446625072
commit 7c56d77184
8 changed files with 95 additions and 17 deletions

View file

@ -1,5 +1,11 @@
2012-11-15 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 30789: Doc/Zsh/grammar.yo, Doc/Zsh/options.yo, Src/hist.c,
Src/init.c, Src/options.c, Src/zsh.h, Test/A04redirect.zsh: add
CONTINUE_ON_ERROR option for compatibility but turn it off:
scripts exit on an error instead of returning to the top-level
like interactive shells.
* 30800: Michal Halenka: Completion/Unix/Command/_arping: fix
option.
@ -335,5 +341,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.5760 $
* $Revision: 1.5761 $
*****************************************************

View file

@ -438,7 +438,7 @@ where var(term) is at least one newline or tt(;).
A short form of tt(select).
)
enditem()
texinode(Reserved Words)(Comments)(Alternate Forms For Complex Commands)(Shell Grammar)
texinode(Reserved Words)(Errors)(Alternate Forms For Complex Commands)(Shell Grammar)
sect(Reserved Words)
cindex(reserved words)
findex(disable, use of)
@ -451,7 +451,56 @@ select coproc nocorrect foreach end ! [[ { })
Additionally, `tt(})' is recognized in any position if neither the
tt(IGNORE_BRACES) option nor the tt(IGNORE_CLOSE_BRACES) option is set.
texinode(Comments)(Aliasing)(Reserved Words)(Shell Grammar)
texinode(Errors)(Comments)(Reserved Words)(Shell Grammar)
sect(Errors)
cindex(errors, handling of)
Certain errors are treated as fatal by the shell: in an interactive
shell, they cause control to return to the command line, and in a
non-interactive shell they cause the shell to be aborted. In older
versions of zsh, a non-interactive shell running a script would not
abort completely, but would resume execution at the next command to be
read from the script, skipping the remainder of any functions or
shell constructs such as loops or conditions; this somewhat illogical
behaviour can be recovered by setting the option tt(CONTINUE_ON_ERROR).
Fatal errors found in non-interactive shells include:
startlist()
list(Failure to parse shell options passed when invoking the shell)
list(Failure to change options with the tt(set) builtin)
list(Parse errors of all sorts, including failures to parse
mathematical expressions)
list(Failures to set or modify variable behaviour with tt(typeset),
tt(local), tt(declare), tt(export), tt(integer), tt(float))
list(Execution of incorrectly positioned loop control structures
(tt(continue), tt(break)))
list(Attempts to use regular expression with no regular expression
module available)
list(Disallowed operations when the tt(RESTRICTED) options is set)
list(Failure to create a pipe needed for a pipeline)
list(Failure to create a multio)
list(Failure to autoload a module needed for a declared shell feature)
list(Errors creating command or process substitutions)
list(Syntax errors in glob qualifiers)
list(File generation errors where not caught by the option tt(BAD_PATTERN))
list(All bad patterns used for matching within case statements)
list(File generation failures where not caused by tt(NO_MATCH) or
list(All file generation errors where the pattern was used to create a
multio)
list(Memory errors where detected by the shell)
list(Invalid subscripts to shell variables)
list(Attempts to assign read-only variables)
list(Logical errors with variables such as assignment to the wrong type)
list(Use of invalid variable names)
list(Errors in variable substitution syntax)
list(Failure to convert characters in tt($')...tt(') expressions)
similar options)
endlist()
If the tt(POSIX_BUILTINS) option is set, more errors associated with
shell builtin commands are treated as fatal, as specified by the POSIX
standard.
texinode(Comments)(Aliasing)(Errors)(Shell Grammar)
sect(Comments)
cindex(comments)
pindex(INTERACTIVE_COMMENTS, use of)

View file

@ -1733,6 +1733,22 @@ Make the tt(echo) builtin compatible with the BSD manref(echo)(1) command.
This disables backslashed escape sequences in echo strings unless the
tt(-e) option is specified.
)
pindex(CONTINUE_ON_ERROR)
pindex(NO_CONTINUE_ON_ERROR)
pindex(CONTINUEONERROR)
pindex(NOCONTINUEONERROR)
cindex(error, option to continue script on)
item(tt(CONTINUE_ON_ERROR))(
If a fatal error is encountered (see
ifnzman(noderef(Errors))\
ifzman(the section ERRORS in zmanref(zshmisc))), and the code is running
in a script, the shell will resume execution at the next statement
in the script at the top level, in other words outside all functions
or shell constructs such as loops and conditions. This mimics the
behaviour of interactive shells, where the shell returns to the
line editor to read a new command; it was the normal behaviour in versions
of zsh before 5.0.1.
)
pindex(CSH_JUNKIE_HISTORY)
pindex(NO_CSH_JUNKIE_HISTORY)
pindex(CSHJUNKIEHISTORY)

View file

@ -573,7 +573,7 @@ histsubchar(int c)
} else {
herrflush();
unqueue_signals();
zerr("Ambiguous history reference");
zerr("ambiguous history reference");
return -1;
}

View file

@ -1608,15 +1608,20 @@ zsh_main(UNUSED(int argc), char **argv)
* We only do this at top level, because if we are
* executing stuff we may refer to them by job pointer.
*/
int errexit = 0;
maybeshrinkjobtab();
do {
/* Reset return from top level which gets us back here */
retflag = 0;
loop(1,0);
if (errflag && !interact && !isset(CONTINUEONERROR)) {
errexit = 1;
break;
}
} while (tok != ENDINPUT && (tok != LEXERR || isset(SHINSTDIN)));
if (tok == LEXERR) {
/* Make sure a parse error exits with non-zero status */
if (tok == LEXERR || errexit) {
/* Make sure a fatal error exits with non-zero status */
if (!lastval)
lastval = 1;
stopmsg = 1;

View file

@ -113,6 +113,7 @@ static struct optname optns[] = {
{{NULL, "combiningchars", 0}, COMBININGCHARS},
{{NULL, "completealiases", 0}, COMPLETEALIASES},
{{NULL, "completeinword", 0}, COMPLETEINWORD},
{{NULL, "continueonerror", 0}, CONTINUEONERROR},
{{NULL, "correct", 0}, CORRECT},
{{NULL, "correctall", 0}, CORRECTALL},
{{NULL, "cshjunkiehistory", OPT_EMULATE|OPT_CSH}, CSHJUNKIEHISTORY},

View file

@ -1971,6 +1971,7 @@ enum {
COMPLETEINWORD,
CORRECT,
CORRECTALL,
CONTINUEONERROR,
CPRECEDENCES,
CSHJUNKIEHISTORY,
CSHJUNKIELOOPS,

View file

@ -419,26 +419,26 @@
>output
?zsh:.:2: no such file or directory: /nonexistent/nonexistent
$ZTST_testdir/../Src/zsh -f -o CONTINUE_ON_ERROR <<<'
readonly foo
foo=bar set output
echo output'
0:failed assignment on posix special, CONTINUE_ON_ERROR
>output
?zsh: read-only variable: foo
$ZTST_testdir/../Src/zsh -f <<<'
readonly foo
foo=bar set output
echo output'
0:failed assignment on posix special, NO_POSIX_BUILTINS
>output
1:failed assignment on posix special, NO_CONTINUE_ON_ERROR
?zsh: read-only variable: foo
$ZTST_testdir/../Src/zsh -f -o POSIX_BUILTINS <<<'
readonly foo
foo=bar set output
echo output'
1:failed assignment on posix special, POSIX_BUILTINS
?zsh: read-only variable: foo
$ZTST_testdir/../Src/zsh -f -o POSIX_BUILTINS <<<'
$ZTST_testdir/../Src/zsh -f -o CONTINUE_ON_ERROR <<<'
readonly foo
foo=bar echo output
echo output'
0:failed assignment on non-posix-special, POSIX_BUILTINS
0:failed assignment on non-posix-special, CONTINUE_ON_ERROR
>output
?zsh: read-only variable: foo