summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/subst.c7
-rw-r--r--Src/zsh.h9
2 files changed, 15 insertions, 1 deletions
diff --git a/Src/subst.c b/Src/subst.c
index 1c2027f32..92fde4598 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -2922,6 +2922,13 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
if (isset(EXECOPT)) {
*idend = '\0';
zerr("%s: %s", idbeg, *s ? s : "parameter not set");
+ /*
+ * In interactive shell we need to return to
+ * top-level prompt --- don't clear this error
+ * after handling a command as we do with
+ * most errors.
+ */
+ errflag |= ERRFLAG_HARD;
if (!interact) {
if (mypid == getpid()) {
/*
diff --git a/Src/zsh.h b/Src/zsh.h
index 996bc3369..2dc5e7e2a 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -2807,7 +2807,14 @@ enum errflag_bits {
/*
* User interrupt.
*/
- ERRFLAG_INT = 2
+ ERRFLAG_INT = 2,
+ /*
+ * Hard error --- return to top-level prompt in interactive
+ * shell. In non-interactive shell we'll typically already
+ * have exited. This is reset by "errflag = 0" in
+ * loop(toplevel = 1, ...).
+ */
+ ERRFLAG_HARD = 4
};
/***********/