summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CWRU/CWRU.chlog70
-rw-r--r--bashline.c57
-rw-r--r--builtins/declare.def3
-rw-r--r--builtins/read.def3
-rw-r--r--builtins/reserved.def10
-rw-r--r--doc/bash.12
-rw-r--r--expr.c10
-rw-r--r--lib/readline/complete.c6
-rw-r--r--lib/readline/display.c51
-rw-r--r--parse.y89
-rw-r--r--patchlevel.h2
-rw-r--r--subst.c28
-rw-r--r--test.c2
-rw-r--r--tests/arith.right34
-rw-r--r--tests/array.right24
-rw-r--r--tests/cond.right2
-rw-r--r--tests/errors.right15
-rw-r--r--tests/errors8.sub3
-rw-r--r--tests/exp.right2
-rw-r--r--tests/more-exp.right2
-rw-r--r--tests/new-exp.right2
-rw-r--r--tests/quotearray.right16
-rw-r--r--tests/test.right16
-rw-r--r--tests/test.tests2
24 files changed, 317 insertions, 134 deletions
diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog
index d5f4ad42..12ce5eda 100644
--- a/CWRU/CWRU.chlog
+++ b/CWRU/CWRU.chlog
@@ -4337,3 +4337,73 @@ lib/readline/display.c
- update_line: use local_prompt_invis_chars to set _rl_last_c_pos
correctly when on a non-terminal prompt line that contains
invisible characters
+
+ 11/7
+ ----
+subst.c
+ - get_var_and_type: allocate new memory for *valp and return it if the
+ type is VT_ARRAYMEMBER. The callers -- all of which treat this case
+ the same as VT_VARIABLE -- will free appropriately. Fixes problems
+ with using parameter operations like ## on dynamic array variables,
+ reported by Ivan Kapranov <koltiradw@yandex.ru> back on 8/31/2022
+
+expr.c
+ - change some error messages to make it clearer these are arithmetic
+ syntax errors. These will require new translations.
+
+test.c
+ - integer_expected_error: change the message to remove `expression',
+ since this is only called for the `test' builtin, where TEST_ARITHEXP
+ is not in FLAGS. This will require a new translation.
+ Reported by Emanuele Torre <torreemanuele6@gmail.com> back on
+ 6/15/2022
+
+ 11/10
+ -----
+builtins/read.def
+ - reset_timeout: when a timer expires, make sure to cancel any
+ readline timeout as well with rl_clear_timeout().
+ From https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1023776
+
+ 11/11
+ -----
+builtins/reserved.def
+ - !: add short help text
+
+lib/readline/complete.c
+ - make_quoted_replacement: if readline found quote characters anywhere
+ in the filename, but is not completing on an unclosed quoted string,
+ and there is an application filename quoting function, let that
+ function quote the filename if necessary
+
+bashline.c
+ - COMPLETE_DQUOTE2: new completion quoting style define
+ - bash_expand_filename: new function, runs a filename passed to it
+ through word expansion, suppressing command and process substitution
+ and returns the result (in new memory if it's different than the
+ filename argument)
+ - bash_quote_filename: if the return value from bash_check_expchar is
+ `$' or ``', expand the filename and if it contains characters that
+ should be quoted, set the quoting style to COMPLETE_DQUOTE2
+ - bash_quote_filename: if the completion quoting style is COMPLETE_DQUOTE2,
+ use sh_mkdoublequoted to put double quotes around the entire
+ unexpanded filename instead of using sh_double_quote, which will
+ backslash-quote any `$'. This is a start at preserving user-supplied
+ quotes if the (expanded) completed filename requires them. From
+ reports by Peng Yu <pengyu.ut@gmail.com> in 5/2020 and
+ Pedro Gimeno <pgba-da0a@personal.formauri.es> in 6/2021
+
+ 11/14
+ -----
+parse.y
+ - report_syntax_error: if word_top is set and we reach EOF, report the
+ starting line number in the error message. From a patch from
+ L A Walsh <bash@tlinx.org> and Manuel Reiter <manuel.reiter@dwd.de>
+ back in 9/2018
+ - MAX_CASE_NEST: doubled to 256, renamed to MAX_COMPOUND_NEST
+ - read_token_word: add `if', `while', and `until' to the set of
+ compound commands that use WORD_TOP and WORD_LINENO (with
+ corresponding changes to grammar productions)
+ - [grammar]: changed check to decrement WORD_TOP to >= 0 since we
+ start at -1 and we want to decrement back to -1 when all loops are
+ closed
diff --git a/bashline.c b/bashline.c
index c85b05b6..2eaeb72a 100644
--- a/bashline.c
+++ b/bashline.c
@@ -151,6 +151,7 @@ static char *maybe_restore_tilde PARAMS((char *, char *));
static char *bash_filename_rewrite_hook PARAMS((char *, int));
static void bash_directory_expansion PARAMS((char **));
+static char *bash_expand_filename PARAMS((char *));
static int bash_filename_stat_hook PARAMS((char **));
static int bash_command_name_stat_hook PARAMS((char **));
static int bash_directory_completion_hook PARAMS((char **));
@@ -328,10 +329,13 @@ static int dabbrev_expand_active = 0;
COMPLETE_DQUOTE = double-quoting the filename
COMPLETE_SQUOTE = single_quoting the filename
COMPLETE_BSQUOTE = backslash-quoting special chars in the filename
+ COMPLETE_DQUOTE2 = double-quote filename, but leave $ and ` unquoted
*/
#define COMPLETE_DQUOTE 1
#define COMPLETE_SQUOTE 2
#define COMPLETE_BSQUOTE 3
+#define COMPLETE_DQUOTE2 4
+
static int completion_quoting_style = COMPLETE_BSQUOTE;
/* Flag values for the final argument to bash_default_completion */
@@ -3368,6 +3372,38 @@ directory_exists (dirname, should_dequote)
free (new_dirname);
return (r);
}
+
+static char *
+bash_expand_filename (filename)
+ char *filename;
+{
+ char *newname;
+ int global_nounset;
+ WORD_LIST *wl;
+
+ newname = savestring (filename);
+ /* no error messages, and expand_prompt_string doesn't longjmp so we don't
+ have to worry about restoring this setting. */
+ global_nounset = unbound_vars_is_error;
+ unbound_vars_is_error = 0;
+ wl = expand_prompt_string (newname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
+ unbound_vars_is_error = global_nounset;
+ free (newname);
+
+ if (wl == 0)
+ return filename;
+ else
+ {
+ newname = string_list (wl);
+ dispose_words (wl);
+ if (newname && *newname && STREQ (newname, filename))
+ {
+ free (newname);
+ return filename;
+ }
+ return newname;
+ }
+}
/* Expand a filename before the readline completion code passes it to stat(2).
The filename will already have had tilde expansion performed. */
@@ -4291,6 +4327,17 @@ bash_quote_filename (s, rtype, qcp)
(expchar = bash_check_expchar (s, 0, &nextch, &closer)) &&
file_exists (s) == 0)
{
+ /* If it looks like the name is subject to expansion, see if we want to
+ double-quote it. */
+ if (expchar == '$' || expchar == '`')
+ {
+ char *newname;
+ newname = bash_expand_filename (s);
+ if (newname && strpbrk (newname, rl_filename_quote_characters))
+ cs = COMPLETE_DQUOTE2;
+ if (newname != s)
+ free (newname);
+ }
/* Usually this will have been set by bash_directory_completion_hook,
but there are cases where it will not be. */
if (rl_filename_quote_characters != custom_filename_quote_characters)
@@ -4300,7 +4347,12 @@ bash_quote_filename (s, rtype, qcp)
else if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && mbschr (s, '\n'))
cs = COMPLETE_SQUOTE;
else if (*qcp == '"')
- cs = COMPLETE_DQUOTE;
+ {
+ if ((expchar = bash_check_expchar (s, 0, &nextch, &closer)) == '$' || expchar == '`')
+ cs = COMPLETE_DQUOTE2;
+ else
+ cs = COMPLETE_DQUOTE;
+ }
else if (*qcp == '\'')
cs = COMPLETE_SQUOTE;
#if defined (BANG_HISTORY)
@@ -4324,6 +4376,9 @@ bash_quote_filename (s, rtype, qcp)
switch (cs)
{
+ case COMPLETE_DQUOTE2:
+ rtext = sh_mkdoublequoted (mtext, strlen (mtext), 1); /* For now */
+ break;
case COMPLETE_DQUOTE:
rtext = sh_double_quote (mtext);
break;
diff --git a/builtins/declare.def b/builtins/declare.def
index 54db59c5..9a914f77 100644
--- a/builtins/declare.def
+++ b/builtins/declare.def
@@ -49,7 +49,8 @@ Options which set attributes:
-u to convert the value of each NAME to upper case on assignment
-x to make NAMEs export
-Using `+' instead of `-' turns off the given attribute.
+Using `+' instead of `-' turns off the given attribute, except for a,
+A, and r.
Variables with the integer attribute have arithmetic evaluation (see
the `let' command) performed when the variable is assigned a value.
diff --git a/builtins/read.def b/builtins/read.def
index 3c38bc02..ddd91d32 100644
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -167,6 +167,9 @@ reset_timeout ()
/* Cancel alarm before restoring signal handler. */
if (read_timeout)
shtimer_clear (read_timeout);
+#if defined (READLINE)
+ rl_clear_timeout ();
+#endif
read_timeout = 0;
}
diff --git a/builtins/reserved.def b/builtins/reserved.def
index 420042dc..359754e3 100644
--- a/builtins/reserved.def
+++ b/builtins/reserved.def
@@ -19,6 +19,16 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bash. If not, see <http://www.gnu.org/licenses/>.
+$BUILTIN !
+$DOCNAME bang
+$SHORT_DOC ! PIPELINE
+Execute PIPELINE, which can be a simple command, and negate PIPELINE's
+return status.
+
+Exit Status:
+The logical negation of PIPELINE's return status.
+$END
+
$BUILTIN for
$SHORT_DOC for NAME [in WORDS ... ] ; do COMMANDS; done
Execute commands for each member in a list.
diff --git a/doc/bash.1 b/doc/bash.1
index 55c56220..d9b60edf 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -1245,7 +1245,7 @@ See the description of
.B shopt
below under
.SM
-.BR SHELL BUILTIN COMMANDS .
+.BR "SHELL BUILTIN COMMANDS" .
.SH PARAMETERS
A
.I parameter
diff --git a/expr.c b/expr.c
index 66e120d9..d8f34a41 100644
--- a/expr.c
+++ b/expr.c
@@ -476,7 +476,7 @@ subexpr (expr)
/*TAG:bash-5.3 make it clear that these are arithmetic syntax errors */
if (curtok != 0)
- evalerror (_("syntax error in expression"));
+ evalerror (_("arithmetic syntax error in expression"));
FREE (tokstr);
FREE (expression);
@@ -529,7 +529,7 @@ expassign ()
}
if (tokstr == 0)
- evalerror (_("syntax error in variable assignment"));
+ evalerror (_("arithmetic syntax error in variable assignment"));
/* XXX - watch out for pointer aliasing issues here */
lhs = savestring (tokstr);
@@ -1106,7 +1106,7 @@ exp0 ()
readtok ();
}
else
- evalerror (_("syntax error: operand expected"));
+ evalerror (_("arithmetic syntax error: operand expected"));
return (val);
}
@@ -1497,9 +1497,9 @@ readtok ()
cp--;
/* use curtok, since it hasn't been copied to lasttok yet */
if (curtok == 0 || _is_arithop (curtok) || _is_multiop (curtok))
- evalerror (_("syntax error: operand expected"));
+ evalerror (_("arithmetic syntax error: operand expected"));
else
- evalerror (_("syntax error: invalid arithmetic operator"));
+ evalerror (_("arithmetic syntax error: invalid arithmetic operator"));
}
else
cp--; /* `unget' the character */
diff --git a/lib/readline/complete.c b/lib/readline/complete.c
index e52aaa29..655d3e99 100644
--- a/lib/readline/complete.c
+++ b/lib/readline/complete.c
@@ -1784,6 +1784,11 @@ make_quoted_replacement (char *match, int mtype, char *qc)
should_quote = rl_filename_quote_characters
? (_rl_strpbrk (match, rl_filename_quote_characters) != 0)
: 0;
+ /* If we saw a quote in the original word, but readline thinks the
+ match doesn't need to be quoted, and the application has a filename
+ quoting function, give the application a chance to quote it if
+ needed so we don't second-guess the user. */
+ should_quote |= *qc == 0 && rl_completion_found_quote && mtype != NO_MATCH && rl_filename_quoting_function;
do_replace = should_quote ? mtype : NO_MATCH;
/* Quote the replacement, since we found an embedded
@@ -1791,6 +1796,7 @@ make_quoted_replacement (char *match, int mtype, char *qc)
if (do_replace != NO_MATCH && rl_filename_quoting_function)
replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
}
+
return (replacement);
}
diff --git a/lib/readline/display.c b/lib/readline/display.c
index f7ffd465..09ecd864 100644
--- a/lib/readline/display.c
+++ b/lib/readline/display.c
@@ -609,11 +609,18 @@ rl_expand_prompt (char *prompt)
FREE (local_prompt);
FREE (local_prompt_prefix);
+ /* Set default values for variables expand_prompt sets */
local_prompt = local_prompt_prefix = (char *)0;
local_prompt_len = 0;
prompt_last_invisible = prompt_invis_chars_first_line = 0;
prompt_visible_length = prompt_physical_chars = 0;
+ if (local_prompt_invis_chars == 0)
+ {
+ local_prompt_invis_chars = (int *)xmalloc (sizeof (int));
+ local_prompt_invis_chars[0] = 0;
+ }
+
if (prompt == 0 || *prompt == 0)
return (0);
@@ -776,6 +783,28 @@ _rl_optimize_redisplay (void)
_rl_quick_redisplay = 1;
}
+/* Useful shorthand used by rl_redisplay, update_line, rl_move_cursor_relative */
+#define INVIS_FIRST() (local_prompt_invis_chars[0])
+#define WRAP_OFFSET(line, offset) ((line <= prompt_last_screen_line) ? local_prompt_invis_chars[line] : 0)
+
+#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
+#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
+#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
+#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
+#define VIS_FACE(line) (vis_face + vis_lbreaks[line])
+#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
+#define VIS_LINE_FACE(line) ((line) > _rl_vis_botlin) ? "" : VIS_FACE(line)
+#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
+#define INV_LINE_FACE(line) (inv_face + inv_lbreaks[line])
+
+#define INV_CHARS_CURRENT_PROMPT_LINE(line) \
+ (local_prompt_invis_chars[line] > 0)
+
+#define OLD_CPOS_IN_PROMPT() (cpos_adjusted == 0 && \
+ _rl_last_c_pos != o_cpos && \
+ _rl_last_c_pos > wrap_offset && \
+ o_cpos < prompt_last_invisible)
+
/* Basic redisplay algorithm. See comments inline. */
void
rl_redisplay (void)
@@ -1271,28 +1300,6 @@ rl_redisplay (void)
second and subsequent lines start at inv_lbreaks[N], offset by
OFFSET (which has already been calculated above). */
-#define INVIS_FIRST() (local_prompt_invis_chars[0])
-#define WRAP_OFFSET(line, offset) ((line <= prompt_last_screen_line) ? local_prompt_invis_chars[line] : 0)
-
-#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
-#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
-#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
-#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
-#define VIS_FACE(line) (vis_face + vis_lbreaks[line])
-#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
-#define VIS_LINE_FACE(line) ((line) > _rl_vis_botlin) ? "" : VIS_FACE(line)
-#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
-#define INV_LINE_FACE(line) (inv_face + inv_lbreaks[line])
-
-#define INV_CHARS_CURRENT_PROMPT_LINE(line) \
- (local_prompt_invis_chars[line] > 0)
-
-#define OLD_CPOS_IN_PROMPT() (cpos_adjusted == 0 && \
- _rl_last_c_pos != o_cpos && \
- _rl_last_c_pos > wrap_offset && \
- o_cpos < prompt_last_invisible)
-
-
/* We don't want to highlight anything that's going to be off the top
of the display; if the current line takes up more than an entire
screen, just mark the lines that won't be displayed as having a
diff --git a/parse.y b/parse.y
index 60d305e1..4f5b84a7 100644
--- a/parse.y
+++ b/parse.y
@@ -317,8 +317,8 @@ static int two_tokens_ago;
/* The line number in a script where the word in a `case WORD', `select WORD'
or `for WORD' begins. This is a nested command maximum, since the array
index is decremented after a case, select, or for command is parsed. */
-#define MAX_CASE_NEST 128
-static int word_lineno[MAX_CASE_NEST+1];
+#define MAX_COMPOUND_NEST 256
+static int word_lineno[MAX_COMPOUND_NEST+1];
static int word_top = -1;
/* If non-zero, it is the token that we want read_token to return
@@ -800,9 +800,15 @@ shell_command: for_command
| case_command
{ $$ = $1; }
| WHILE compound_list DO compound_list DONE
- { $$ = make_while_command ($2, $4); }
+ {
+ $$ = make_while_command ($2, $4);
+ if (word_top >= 0) word_top--;
+ }
| UNTIL compound_list DO compound_list DONE
- { $$ = make_until_command ($2, $4); }
+ {
+ $$ = make_until_command ($2, $4);
+ if (word_top >= 0) word_top--;
+ }
| select_command
{ $$ = $1; }
| if_command
@@ -822,42 +828,42 @@ shell_command: for_command
for_command: FOR WORD newline_list DO compound_list DONE
{
$$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD newline_list '{' compound_list '}'
{
$$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD ';' newline_list DO compound_list DONE
{
$$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD ';' newline_list '{' compound_list '}'
{
$$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE
{
$$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}'
{
$$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE
{
$$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}'
{
$$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
;
@@ -865,84 +871,84 @@ arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_
{
$$ = make_arith_for_command ($2, $6, arith_for_lineno);
if ($$ == 0) YYERROR;
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR ARITH_FOR_EXPRS list_terminator newline_list '{' compound_list '}'
{
$$ = make_arith_for_command ($2, $6, arith_for_lineno);
if ($$ == 0) YYERROR;
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR ARITH_FOR_EXPRS DO compound_list DONE
{
$$ = make_arith_for_command ($2, $4, arith_for_lineno);
if ($$ == 0) YYERROR;
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| FOR ARITH_FOR_EXPRS '{' compound_list '}'
{
$$ = make_arith_for_command ($2, $4, arith_for_lineno);
if ($$ == 0) YYERROR;
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
;
select_command: SELECT WORD newline_list DO compound_list DONE
{
$$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD newline_list '{' compound_list '}'
{
$$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD ';' newline_list DO compound_list DONE
{
$$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD ';' newline_list '{' compound_list '}'
{
$$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE
{
$$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}'
{
$$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD newline_list IN list_terminator newline_list DO compound_list DONE
{
$$ = make_select_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| SELECT WORD newline_list IN list_terminator newline_list '{' compound_list '}'
{
$$ = make_select_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
;
case_command: CASE WORD newline_list IN newline_list ESAC
{
$$ = make_case_command ($2, (PATTERN_LIST *)NULL, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| CASE WORD newline_list IN case_clause_sequence newline_list ESAC
{
$$ = make_case_command ($2, $5, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
| CASE WORD newline_list IN case_clause ESAC
{
$$ = make_case_command ($2, $5, word_lineno[word_top]);
- if (word_top > 0) word_top--;
+ if (word_top >= 0) word_top--;
}
;
@@ -1058,11 +1064,21 @@ coproc: COPROC shell_command
;
if_command: IF compound_list THEN compound_list FI
- { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
+ {
+ $$ = make_if_command ($2, $4, (COMMAND *)NULL);
+ if (word_top >= 0) word_top--;
+ }
+
| IF compound_list THEN compound_list ELSE compound_list FI
- { $$ = make_if_command ($2, $4, $6); }
+ {
+ $$ = make_if_command ($2, $4, $6);
+ if (word_top >= 0) word_top--;
+ }
| IF compound_list THEN compound_list elif_clause FI
- { $$ = make_if_command ($2, $4, $5); }
+ {
+ $$ = make_if_command ($2, $4, $5);
+ if (word_top >= 0) word_top--;
+ }
;
@@ -4450,7 +4466,7 @@ parse_dparen (c)
#if defined (ARITH_FOR_COMMAND)
if (last_read_token == FOR)
{
- if (word_top < MAX_CASE_NEST)
+ if (word_top < MAX_COMPOUND_NEST)
word_top++;
arith_for_lineno = word_lineno[word_top] = line_number;
cmdtyp = parse_arith_cmd (&wval, 0);
@@ -5338,11 +5354,18 @@ got_token:
case CASE:
case SELECT:
case FOR:
- if (word_top < MAX_CASE_NEST)
+ if (word_top < MAX_COMPOUND_NEST)
word_top++;
word_lineno[word_top] = line_number;
expecting_in_token++;
break;
+ case IF:
+ case WHILE:
+ case UNTIL:
+ if (word_top < MAX_COMPOUND_NEST)
+ word_top++;
+ word_lineno[word_top] = line_number;
+ break;
}
return (result);
@@ -6274,6 +6297,8 @@ report_syntax_error (message)
{
if (EOF_Reached && shell_eof_token && current_token != shell_eof_token)
parser_error (line_number, _("unexpected EOF while looking for matching `%c'"), shell_eof_token);
+ else if (EOF_Reached && word_top >= 0)
+ parser_error (line_number, _("syntax error: unexpected end of file from command on line %d"), word_lineno[word_top]);
else
{
msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
diff --git a/patchlevel.h b/patchlevel.h
index 0d5a448e..81cb6728 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 2
+#define PATCHLEVEL 9
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index a72711e7..7ec8f8e9 100644
--- a/subst.c
+++ b/subst.c
@@ -85,6 +85,7 @@ extern int errno;
#define VT_STARSUB 128 /* $* or ${array[*]} -- used to split */
+
/* Flags for quoted_strchr */
#define ST_BACKSL 0x01
#define ST_CTLESC 0x02
@@ -5912,8 +5913,7 @@ parameter_brace_remove_pattern (varname, value, estatep, patstr, rtype, quoted,
case VT_VARIABLE:
case VT_ARRAYMEMBER:
temp1 = remove_pattern (val, pattern, patspec);
- if (vtype == VT_VARIABLE)
- FREE (val);
+ FREE (val);
if (temp1)
{
val = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
@@ -8320,7 +8320,8 @@ get_var_and_type (varname, value, estatep, quoted, flags, varp, valp)
else
{
vtype = VT_ARRAYMEMBER;
- *valp = array_value (vname, Q_DOUBLE_QUOTES, flags, estatep);
+ temp = array_value (vname, Q_DOUBLE_QUOTES, flags, estatep);
+ *valp = temp ? savestring (temp) : temp;
}
*varp = v;
}
@@ -8337,14 +8338,16 @@ get_var_and_type (varname, value, estatep, quoted, flags, varp, valp)
{
vtype = VT_ARRAYMEMBER;
*varp = v;
- *valp = array_value (vname, Q_DOUBLE_QUOTES, flags, estatep);
+ temp = array_value (vname, Q_DOUBLE_QUOTES, flags, estatep);
+ *valp = temp ? savestring (temp) : temp;
}
}
else if ((v = find_variable (vname)) && (invisible_p (v) == 0) && (assoc_p (v) || array_p (v)))
{
vtype = VT_ARRAYMEMBER;
*varp = v;
- *valp = assoc_p (v) ? assoc_reference (assoc_cell (v), "0") : array_reference (array_cell (v), 0);
+ temp = assoc_p (v) ? assoc_reference (assoc_cell (v), "0") : array_reference (array_cell (v), 0);
+ *valp = temp ? savestring (temp) : temp;
}
else
#endif
@@ -8708,8 +8711,7 @@ parameter_brace_transform (varname, value, estatep, xform, rtype, quoted, pflags
case VT_VARIABLE:
case VT_ARRAYMEMBER:
temp1 = string_transform (xc, v, val);
- if (vtype == VT_VARIABLE)
- FREE (val);
+ FREE (val);
if (temp1)
{
val = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
@@ -8826,7 +8828,7 @@ parameter_brace_substring (varname, value, estatep, substr, quoted, pflags, flag
this_command_name = oname;
if (r <= 0)
{
- if (vtype == VT_VARIABLE)
+ if (vtype == VT_VARIABLE || vtype == VT_ARRAYMEMBER)
FREE (val);
return ((r == 0) ? &expand_param_error : (char *)NULL);
}
@@ -8842,8 +8844,7 @@ parameter_brace_substring (varname, value, estatep, substr, quoted, pflags, flag
#endif
tt = substring (val, e1, e2);
- if (vtype == VT_VARIABLE)
- FREE (val);
+ FREE (val);
if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
temp = quote_string (tt);
else
@@ -9202,7 +9203,6 @@ parameter_brace_patsub (varname, value, estatep, patsub, quoted, pflags, flags)
consistently. */
if (patsub_replacement && rep && *rep && shouldexp_replacement (rep))
mflags |= MATCH_EXPREP;
-
}
/* ksh93 doesn't allow the match specifier to be a part of the expanded
@@ -9241,8 +9241,7 @@ parameter_brace_patsub (varname, value, estatep, patsub, quoted, pflags, flags)
case VT_VARIABLE:
case VT_ARRAYMEMBER:
temp = pat_subst (val, p, rep, mflags);
- if (vtype == VT_VARIABLE)
- FREE (val);
+ FREE (val);
if (temp)
{
tt = (mflags & MATCH_QUOTED) ? quote_string (temp) : quote_escapes (temp);
@@ -9429,8 +9428,7 @@ parameter_brace_casemod (varname, value, estatep, modspec, patspec, quoted, pfla
case VT_VARIABLE:
case VT_ARRAYMEMBER:
temp = sh_modcase (val, pat, modop);
- if (vtype == VT_VARIABLE)
- FREE (val);
+ FREE (val);
if (temp)
{
tt = (mflags & MATCH_QUOTED) ? quote_string (temp) : quote_escapes (temp);
diff --git a/test.c b/test.c
index 9997df14..6e016e36 100644
--- a/test.c
+++ b/test.c
@@ -153,7 +153,7 @@ static void
integer_expected_error (pch)
char *pch;
{
- test_syntax_error (_("%s: integer expression expected"), pch);
+ test_syntax_error (_("%s: integer expected"), pch);
}
/* Increment our position in the argument list. Check that we're not
diff --git a/tests/arith.right b/tests/arith.right
index 02687815..75c12001 100644
--- a/tests/arith.right
+++ b/tests/arith.right
@@ -85,8 +85,8 @@
./arith.tests: line 168: 7 = 43 : attempted assignment to non-variable (error token is "= 43 ")
./arith.tests: line 169: 2#44: value too great for base (error token is "2#44")
./arith.tests: line 170: 44 / 0 : division by 0 (error token is "0 ")
-./arith.tests: line 171: let: jv += $iv: syntax error: operand expected (error token is "$iv")
-./arith.tests: line 172: jv += $iv : syntax error: operand expected (error token is "$iv ")
+./arith.tests: line 171: let: jv += $iv: arithmetic syntax error: operand expected (error token is "$iv")
+./arith.tests: line 172: jv += $iv : arithmetic syntax error: operand expected (error token is "$iv ")
./arith.tests: line 173: let: rv = 7 + (43 * 6: missing `)' (error token is "6")
./arith.tests: line 177: 0#4: invalid number (error token is "0#4")
./arith.tests: line 178: 2#110#11: invalid number (error token is "2#110#11")
@@ -97,7 +97,7 @@ ok
6
1
0
-./arith.tests: line 196: 4 + : syntax error: operand expected (error token is "+ ")
+./arith.tests: line 196: 4 + : arithmetic syntax error: operand expected (error token is "+ ")
16
./arith.tests: line 201: 4 ? : 3 + 5 : expression expected (error token is ": 3 + 5 ")
./arith.tests: line 202: 1 ? 20 : `:' expected for conditional expression (error token is "20 ")
@@ -131,7 +131,7 @@ ok
4
4
7
-./arith.tests: line 260: 7-- : syntax error: operand expected (error token is "- ")
+./arith.tests: line 260: 7-- : arithmetic syntax error: operand expected (error token is "- ")
./arith.tests: line 262: --x=7 : attempted assignment to non-variable (error token is "=7 ")
./arith.tests: line 263: ++x=7 : attempted assignment to non-variable (error token is "=7 ")
./arith.tests: line 265: x++=7 : attempted assignment to non-variable (error token is "=7 ")
@@ -143,10 +143,10 @@ ok
7
2
2
-./arith1.sub: line 15: 4-- : syntax error: operand expected (error token is "- ")
-./arith1.sub: line 16: 4++ : syntax error: operand expected (error token is "+ ")
-./arith1.sub: line 17: 4 -- : syntax error: operand expected (error token is "- ")
-./arith1.sub: line 18: 4 ++ : syntax error: operand expected (error token is "+ ")
+./arith1.sub: line 15: 4-- : arithmetic syntax error: operand expected (error token is "- ")
+./arith1.sub: line 16: 4++ : arithmetic syntax error: operand expected (error token is "+ ")
+./arith1.sub: line 17: 4 -- : arithmetic syntax error: operand expected (error token is "- ")
+./arith1.sub: line 18: 4 ++ : arithmetic syntax error: operand expected (error token is "+ ")
1
2
1
@@ -161,10 +161,10 @@ ok
2
-2
1
-./arith1.sub: line 48: ((: ++ : syntax error: operand expected (error token is "+ ")
+./arith1.sub: line 48: ((: ++ : arithmetic syntax error: operand expected (error token is "+ ")
7
7
-./arith1.sub: line 51: ((: -- : syntax error: operand expected (error token is "- ")
+./arith1.sub: line 51: ((: -- : arithmetic syntax error: operand expected (error token is "- ")
7
7
7
@@ -183,10 +183,10 @@ ok
1
4
0
-./arith2.sub: line 46: ((: -- : syntax error: operand expected (error token is "- ")
+./arith2.sub: line 46: ((: -- : arithmetic syntax error: operand expected (error token is "- ")
-7
-7
-./arith2.sub: line 50: ((: ++ : syntax error: operand expected (error token is "+ ")
+./arith2.sub: line 50: ((: ++ : arithmetic syntax error: operand expected (error token is "+ ")
7
7
-7
@@ -250,14 +250,14 @@ efg
0
0
8 12
-./arith.tests: line 310: ((: x=9 y=41 : syntax error in expression (error token is "y=41 ")
-./arith.tests: line 314: a b: syntax error in expression (error token is "b")
-./arith.tests: line 315: ((: a b: syntax error in expression (error token is "b")
+./arith.tests: line 310: ((: x=9 y=41 : arithmetic syntax error in expression (error token is "y=41 ")
+./arith.tests: line 314: a b: arithmetic syntax error in expression (error token is "b")
+./arith.tests: line 315: ((: a b: arithmetic syntax error in expression (error token is "b")
42
42
42
42
42
42
-./arith.tests: line 330: 'foo' : syntax error: operand expected (error token is "'foo' ")
-./arith.tests: line 333: b[c]d: syntax error in expression (error token is "d")
+./arith.tests: line 330: 'foo' : arithmetic syntax error: operand expected (error token is "'foo' ")
+./arith.tests: line 333: b[c]d: arithmetic syntax error in expression (error token is "d")
diff --git a/tests/array.right b/tests/array.right
index 36d49363..a5cdea88 100644
--- a/tests/array.right
+++ b/tests/array.right
@@ -400,7 +400,7 @@ qux: unset array element 0: ok
0
0
1
-./array17.sub: line 43: ~: syntax error: operand expected (error token is "~")
+./array17.sub: line 43: ~: arithmetic syntax error: operand expected (error token is "~")
0
0
3
@@ -415,7 +415,7 @@ one
one
two
two
-./array17.sub: line 89: ~ : syntax error: operand expected (error token is "~ ")
+./array17.sub: line 89: ~ : arithmetic syntax error: operand expected (error token is "~ ")
1
argv[1] = <>
argv[2] = <>
@@ -453,7 +453,7 @@ declare -A a=([1]="b" [0]="a" )
declare -a var=([0]="[\$(echo" [1]="total" [2]="0)]=1" [3]="[2]=2]")
declare -a var=([0]="[\$(echo total 0)]=1 [2]=2]")
declare -a var=([0]="[\$(echo" [1]="total" [2]="0)]=1" [3]="[2]=2]")
-./array19.sub: line 89: total 0: syntax error in expression (error token is "0")
+./array19.sub: line 89: total 0: arithmetic syntax error in expression (error token is "0")
declare -a var=()
declare -al foo=([0]="abcde" [1]="two" [2]="three")
declare -al foo=([0]="abcde")
@@ -522,14 +522,14 @@ p3
argv[1] = <y>
<X> <X> <X> <X>
<X> <X> <X> <X>
-./array23.sub: line 22: $( echo >&2 foo ) : syntax error: operand expected (error token is "$( echo >&2 foo ) ")
-./array23.sub: line 23: $( echo >&2 foo ) : syntax error: operand expected (error token is "$( echo >&2 foo ) ")
-./array23.sub: line 24: $( echo >&2 foo ) : syntax error: operand expected (error token is "$( echo >&2 foo ) ")
-./array23.sub: line 26: $( echo >&2 foo ) : syntax error: operand expected (error token is "$( echo >&2 foo ) ")
-./array23.sub: line 30: $( echo >&2 foo ): syntax error: operand expected (error token is "$( echo >&2 foo )")
-./array23.sub: line 33: $( echo >&2 foo ): syntax error: operand expected (error token is "$( echo >&2 foo )")
-./array23.sub: line 34: $index: syntax error: operand expected (error token is "$index")
-./array23.sub: line 35: $( echo >&2 foo ): syntax error: operand expected (error token is "$( echo >&2 foo )")
+./array23.sub: line 22: $( echo >&2 foo ) : arithmetic syntax error: operand expected (error token is "$( echo >&2 foo ) ")
+./array23.sub: line 23: $( echo >&2 foo ) : arithmetic syntax error: operand expected (error token is "$( echo >&2 foo ) ")
+./array23.sub: line 24: $( echo >&2 foo ) : arithmetic syntax error: operand expected (error token is "$( echo >&2 foo ) ")
+./array23.sub: line 26: $( echo >&2 foo ) : arithmetic syntax error: operand expected (error token is "$( echo >&2 foo ) ")
+./array23.sub: line 30: $( echo >&2 foo ): arithmetic syntax error: operand expected (error token is "$( echo >&2 foo )")
+./array23.sub: line 33: $( echo >&2 foo ): arithmetic syntax error: operand expected (error token is "$( echo >&2 foo )")
+./array23.sub: line 34: $index: arithmetic syntax error: operand expected (error token is "$index")
+./array23.sub: line 35: $( echo >&2 foo ): arithmetic syntax error: operand expected (error token is "$( echo >&2 foo )")
0
0
0
@@ -583,7 +583,7 @@ jkl
1. indexed:
reference:
1. 0
-./array25.sub: line 24: ' ': syntax error: operand expected (error token is "' '")
+./array25.sub: line 24: ' ': arithmetic syntax error: operand expected (error token is "' '")
3. 0
4. 0
5. 0
diff --git a/tests/cond.right b/tests/cond.right
index a72a1537..7bed9fd7 100644
--- a/tests/cond.right
+++ b/tests/cond.right
@@ -27,7 +27,7 @@ returns: 0
returns: 1
returns: 1
returns: 0
-./cond.tests: line 122: [[: 4+: syntax error: operand expected (error token is "+")
+./cond.tests: line 122: [[: 4+: arithmetic syntax error: operand expected (error token is "+")
returns: 1
returns: 0
returns: 0
diff --git a/tests/errors.right b/tests/errors.right
index 0bd88efb..46854574 100644
--- a/tests/errors.right
+++ b/tests/errors.right
@@ -83,8 +83,8 @@ readonly: usage: readonly [-aAf] [name[=value] ...] or readonly -p
eval: usage: eval [arg ...]
./errors.tests: line 227: command: -i: invalid option
command: usage: command [-pVv] command [arg ...]
-./errors.tests: line 230: /bin/sh + 0: syntax error: operand expected (error token is "/bin/sh + 0")
-./errors.tests: line 231: /bin/sh + 0: syntax error: operand expected (error token is "/bin/sh + 0")
+./errors.tests: line 230: /bin/sh + 0: arithmetic syntax error: operand expected (error token is "/bin/sh + 0")
+./errors.tests: line 231: /bin/sh + 0: arithmetic syntax error: operand expected (error token is "/bin/sh + 0")
./errors.tests: line 234: trap: NOSIG: invalid signal specification
./errors.tests: line 237: trap: -s: invalid option
trap: usage: trap [-lp] [[arg] signal_spec ...]
@@ -196,12 +196,17 @@ ok 4
ok 5
./errors8.sub: line 14: set: notanoption: invalid option name
ok 6
+./errors8.sub: line 16: /notthere: No such file or directory
+ok 7
+./errors8.sub: line 17: .: -x: invalid option
+.: usage: . filename [arguments]
+ok 8
DEBUG
-./errors9.sub: line 6: [[: ++: syntax error: operand expected (error token is "+")
+./errors9.sub: line 6: [[: ++: arithmetic syntax error: operand expected (error token is "+")
DEBUG
-./errors9.sub: line 8: ((: -- : syntax error: operand expected (error token is "- ")
+./errors9.sub: line 8: ((: -- : arithmetic syntax error: operand expected (error token is "- ")
DEBUG
-./errors9.sub: line 10: ((: -- : syntax error: operand expected (error token is "- ")
+./errors9.sub: line 10: ((: -- : arithmetic syntax error: operand expected (error token is "- ")
bash: line 1: return: can only `return' from a function or sourced script
after return
bash: line 1: return: can only `return' from a function or sourced script
diff --git a/tests/errors8.sub b/tests/errors8.sub
index b65e1ab6..699a2cac 100644
--- a/tests/errors8.sub
+++ b/tests/errors8.sub
@@ -12,3 +12,6 @@ command shift 12 || echo ok 4
command return 16 || echo ok 5
command set -o notanoption || echo ok 6
+
+command . /notthere || echo ok 7
+command . -x true || echo ok 8
diff --git a/tests/exp.right b/tests/exp.right
index 60241a1d..c1a99290 100644
--- a/tests/exp.right
+++ b/tests/exp.right
@@ -236,7 +236,7 @@ declare -- var="x\001y\177z"$
argv[1] = <$'x\001y\177z'>
argv[1] = <x^Ay^?z>
var=$'x\001y\177z'
-./exp8.sub: line 30: xyz: syntax error: invalid arithmetic operator (error token is "z")
+./exp8.sub: line 30: xyz: arithmetic syntax error: invalid arithmetic operator (error token is "z")
declare -a array=()
declare -a array=([0]=$'x\001y\177z')
argv[1] = <x^Ay^?z>
diff --git a/tests/more-exp.right b/tests/more-exp.right
index f5f37c92..2fd3548f 100644
--- a/tests/more-exp.right
+++ b/tests/more-exp.right
@@ -190,7 +190,7 @@ argv[1] = <0>
./more-exp.tests: line 442: ${#=}: bad substitution
./more-exp.tests: line 444: ${#+}: bad substitution
./more-exp.tests: line 446: ${#1xyz}: bad substitution
-./more-exp.tests: line 449: #: %: syntax error: operand expected (error token is "%")
+./more-exp.tests: line 449: #: %: arithmetic syntax error: operand expected (error token is "%")
argv[1] = <0>
argv[1] = <a+b>
argv[1] = <+>
diff --git a/tests/new-exp.right b/tests/new-exp.right
index e3dc40e1..37d38530 100644
--- a/tests/new-exp.right
+++ b/tests/new-exp.right
@@ -3,7 +3,7 @@ argv[1] = <foo>
argv[1] = </usr/homes/chet>
argv[1] = </usr/homes/chet>
argv[1] = </usr/homes/chet>
-./new-exp.tests: line 41: HOME: }: syntax error: operand expected (error token is "}")
+./new-exp.tests: line 41: HOME: }: arithmetic syntax error: operand expected (error token is "}")
unset
argv[1] = </usr/homes/chet>
argv[1] = </usr/homes/chet>
diff --git a/tests/quotearray.right b/tests/quotearray.right
index e6893659..a3cc93a6 100644
--- a/tests/quotearray.right
+++ b/tests/quotearray.right
@@ -1,9 +1,9 @@
declare -A assoc=(["x],b[\$(echo uname >&2)"]="1" )
declare -A assoc=(["\$key"]="1" ["x],b[\$(echo uname >&2)"]="1" )
declare -A assoc=(["\$key"]="1" ["x],b[\$(echo uname >&2)"]="2" )
-./quotearray.tests: line 31: ((: 'assoc[x\],b\[\$(echo uname >&2)]++' : syntax error: operand expected (error token is "'assoc[x\],b\[\$(echo uname >&2)]++' ")
+./quotearray.tests: line 31: ((: 'assoc[x\],b\[\$(echo uname >&2)]++' : arithmetic syntax error: operand expected (error token is "'assoc[x\],b\[\$(echo uname >&2)]++' ")
declare -A assoc=(["\$key"]="1" ["x],b[\$(echo uname >&2)"]="2" )
-./quotearray.tests: line 34: ((: 'assoc[x\],b\[\$(echo uname >&2)]'++ : syntax error: operand expected (error token is "'assoc[x\],b\[\$(echo uname >&2)]'++ ")
+./quotearray.tests: line 34: ((: 'assoc[x\],b\[\$(echo uname >&2)]'++ : arithmetic syntax error: operand expected (error token is "'assoc[x\],b\[\$(echo uname >&2)]'++ ")
declare -A assoc=(["\$key"]="1" ["x],b[\$(echo uname >&2)"]="2" )
declare -A assoc=(["\$key"]="1" ["x],b[\$(echo uname >&2)"]="3" )
4
@@ -24,14 +24,14 @@ declare -a a=([0]="12" [1]="42")
declare -Ai assoc=(["']"]="3" ["\$var"]="1" )
105
declare -A assoc=(["\` echo >&2 foo\`"]="42" ["\$( echo >&2 bar)"]="63" )
-./quotearray.tests: line 140: x],b[$(echo uname >&2): syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
-./quotearray.tests: line 144: x],b[$(echo uname >&2): syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
+./quotearray.tests: line 140: x],b[$(echo uname >&2): arithmetic syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
+./quotearray.tests: line 144: x],b[$(echo uname >&2): arithmetic syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
1
-./quotearray.tests: line 147: x],b[$(echo uname >&2): syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
+./quotearray.tests: line 147: x],b[$(echo uname >&2): arithmetic syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
1
-./quotearray.tests: line 150: x],b[$(echo uname >&2): syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
+./quotearray.tests: line 150: x],b[$(echo uname >&2): arithmetic syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
1
-./quotearray.tests: line 153: x],b[$(echo uname >&2): syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
+./quotearray.tests: line 153: x],b[$(echo uname >&2): arithmetic syntax error: invalid arithmetic operator (error token is "],b[$(echo uname >&2)")
1
declare -A assoc
0
@@ -44,7 +44,7 @@ declare -A assoc=(["\` echo >&2 foo\`"]="128" [0]="0" ["]"]="12" ["x],b[\$(echo
foo
0
0
-./quotearray1.sub: line 68: 0\],b\[1: syntax error: invalid arithmetic operator (error token is "\],b\[1")
+./quotearray1.sub: line 68: 0\],b\[1: arithmetic syntax error: invalid arithmetic operator (error token is "\],b\[1")
declare -a array
0
0
diff --git a/tests/test.right b/tests/test.right
index 4be22f4b..daf2f532 100644
--- a/tests/test.right
+++ b/tests/test.right
@@ -235,28 +235,28 @@ t -G /tmp/test.group
t -h /tmp/test.symlink
0
t 4+3 -eq 7
-./test.tests: line 26: test: 4+3: integer expression expected
+./test.tests: line 26: test: 4+3: integer expected
2
b 4-5 -eq 7
-./test.tests: line 20: [: 4+3: integer expression expected
+./test.tests: line 20: [: 4-5: integer expected
2
t 9 -eq 4+5
-./test.tests: line 26: test: 4+5: integer expression expected
+./test.tests: line 26: test: 4+5: integer expected
2
b 9 -eq 4+5
-./test.tests: line 20: [: 4+5: integer expression expected
+./test.tests: line 20: [: 4+5: integer expected
2
t A -eq 7
-./test.tests: line 26: test: A: integer expression expected
+./test.tests: line 26: test: A: integer expected
2
b A -eq 7
-./test.tests: line 20: [: A: integer expression expected
+./test.tests: line 20: [: A: integer expected
2
t 9 -eq B
-./test.tests: line 26: test: B: integer expression expected
+./test.tests: line 26: test: B: integer expected
2
b 9 -eq B
-./test.tests: line 20: [: B: integer expression expected
+./test.tests: line 20: [: B: integer expected
2
t ( 1 = 2
./test.tests: line 26: test: `)' expected
diff --git a/tests/test.tests b/tests/test.tests
index df4b8509..a30ae036 100644
--- a/tests/test.tests
+++ b/tests/test.tests
@@ -397,7 +397,7 @@ fi
echo "t 4+3 -eq 7"
t 4+3 -eq 7
echo "b 4-5 -eq 7"
-b 4+3 -eq 7
+b 4-5 -eq 7
echo "t 9 -eq 4+5"
t 9 -eq 4+5