summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Doc/Zsh/grammar.yo53
-rw-r--r--Doc/Zsh/options.yo16
-rw-r--r--Src/hist.c2
-rw-r--r--Src/init.c9
-rw-r--r--Src/options.c1
-rw-r--r--Src/zsh.h1
-rw-r--r--Test/A04redirect.ztst12
8 files changed, 90 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index d65cfa957..36bac2884 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 $
*****************************************************
diff --git a/Doc/Zsh/grammar.yo b/Doc/Zsh/grammar.yo
index 1eb358ea3..e1b2f0ea6 100644
--- a/Doc/Zsh/grammar.yo
+++ b/Doc/Zsh/grammar.yo
@@ -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)
diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo
index 3114ecc05..6c8d423cb 100644
--- a/Doc/Zsh/options.yo
+++ b/Doc/Zsh/options.yo
@@ -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)
diff --git a/Src/hist.c b/Src/hist.c
index 0e63dca37..561e2acd5 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -573,7 +573,7 @@ histsubchar(int c)
} else {
herrflush();
unqueue_signals();
- zerr("Ambiguous history reference");
+ zerr("ambiguous history reference");
return -1;
}
diff --git a/Src/init.c b/Src/init.c
index 6c2ba13e4..8467a739c 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -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;
diff --git a/Src/options.c b/Src/options.c
index 80fef3d00..b36bd9944 100644
--- a/Src/options.c
+++ b/Src/options.c
@@ -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},
diff --git a/Src/zsh.h b/Src/zsh.h
index e51572bcf..207ef1836 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1971,6 +1971,7 @@ enum {
COMPLETEINWORD,
CORRECT,
CORRECTALL,
+ CONTINUEONERROR,
CPRECEDENCES,
CSHJUNKIEHISTORY,
CSHJUNKIELOOPS,
diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst
index d3c0a4a99..b8086e724 100644
--- a/Test/A04redirect.ztst
+++ b/Test/A04redirect.ztst
@@ -419,26 +419,26 @@
>output
?zsh:.:2: no such file or directory: /nonexistent/nonexistent
- $ZTST_testdir/../Src/zsh -f <<<'
+ $ZTST_testdir/../Src/zsh -f -o CONTINUE_ON_ERROR <<<'
readonly foo
foo=bar set output
echo output'
-0:failed assignment on posix special, NO_POSIX_BUILTINS
+0:failed assignment on posix special, CONTINUE_ON_ERROR
>output
?zsh: read-only variable: foo
- $ZTST_testdir/../Src/zsh -f -o POSIX_BUILTINS <<<'
+ $ZTST_testdir/../Src/zsh -f <<<'
readonly foo
foo=bar set output
echo output'
-1:failed assignment on posix special, POSIX_BUILTINS
+1:failed assignment on posix special, NO_CONTINUE_ON_ERROR
?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