mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-06-28 16:09:51 +02:00
commit bash-20200814 snapshot
This commit is contained in:
@@ -8889,3 +8889,27 @@ flags.c
|
||||
|
||||
{flags,variables}.c,flags.h,builtins/{declare,setattr.def}
|
||||
- no_invisible_vars: remove all references
|
||||
|
||||
command.h
|
||||
- PF_ALLINDS: new flag, means to expand an array variable name without
|
||||
a subscript as if it were subscripted by `@' instead of `0'
|
||||
|
||||
subst.c
|
||||
- parameter_brace_expand_word: if PFLAGS contains PF_ALLINDS, expand
|
||||
an array variable name as if it were subscripted by "@" instead of
|
||||
0/"0": a string with the element values separated by " ". Little
|
||||
nuance; we're just interested in whether or not there are any
|
||||
values at all
|
||||
- parameter_brace_expand: if we are expanding something like ${foo@a},
|
||||
pass PF_ALLINDS to parameter_brace_expand_word and
|
||||
parameter_brace_expand_indir so we don't get tripped up on `nounset'
|
||||
if foo has an assigned subscript other than 0/"0". Inspired by a
|
||||
report from Andrew Neff <andrew.neff@visionsystemsinc.com>
|
||||
|
||||
8/17
|
||||
----
|
||||
bashhist.c
|
||||
- bash_add_history,maybe_add_history: don't need to call shell_comment
|
||||
if we are in the middle of adding a here-document, since it may
|
||||
call the parser recursively on data that is not guaranteed to be
|
||||
valid input. From a report by Hyunho Cho <mug896@gmail.com>
|
||||
|
||||
@@ -1225,6 +1225,7 @@ tests/new-exp11.sub f
|
||||
tests/new-exp12.sub f
|
||||
tests/new-exp13.sub f
|
||||
tests/new-exp14.sub f
|
||||
tests/new-exp15.sub f
|
||||
tests/new-exp.right f
|
||||
tests/nquote.tests f
|
||||
tests/nquote.right f
|
||||
|
||||
+2
-2
@@ -757,7 +757,7 @@ maybe_add_history (line)
|
||||
int is_comment;
|
||||
|
||||
hist_last_line_added = 0;
|
||||
is_comment = shell_comment (line);
|
||||
is_comment = (parser_state & PST_HEREDOC) ? 0 : shell_comment (line);
|
||||
|
||||
/* Don't use the value of history_control to affect the second
|
||||
and subsequent lines of a multi-line command (old code did
|
||||
@@ -874,7 +874,7 @@ bash_add_history (line)
|
||||
add_it = 1;
|
||||
if (command_oriented_history && current_command_line_count > 1)
|
||||
{
|
||||
is_comment = shell_comment (line);
|
||||
is_comment = (parser_state & PST_HEREDOC) ? 0 : shell_comment (line);
|
||||
|
||||
/* The second and subsequent lines of a here document have the trailing
|
||||
newline preserved. We don't want to add extra newlines here, but we
|
||||
|
||||
@@ -113,6 +113,7 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
||||
#define PF_ASSIGNRHS 0x08 /* same as W_ASSIGNRHS */
|
||||
#define PF_COMPLETE 0x10 /* same as W_COMPLETE, sets SX_COMPLETE */
|
||||
#define PF_EXPANDRHS 0x20 /* same as W_EXPANDRHS */
|
||||
#define PF_ALLINDS 0x40 /* array, act as if [@] was supplied */
|
||||
|
||||
/* Possible values for subshell_environment */
|
||||
#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
|
||||
|
||||
@@ -6823,7 +6823,15 @@ expand_arrayref:
|
||||
if (var_isset (var) && invisible_p (var) == 0)
|
||||
{
|
||||
#if defined (ARRAY_VARS)
|
||||
if (assoc_p (var))
|
||||
/* We avoid a memory leak by saving TT as the memory allocated by
|
||||
assoc_to_string or array_to_string and leaving it 0 otherwise,
|
||||
then freeing TT after quoting temp. */
|
||||
tt = (char *)NULL;
|
||||
if ((pflags & PF_ALLINDS) && assoc_p (var))
|
||||
tt = temp = assoc_empty (assoc_cell (var)) ? (char *)NULL : assoc_to_string (assoc_cell (var), " ", quoted);
|
||||
else if ((pflags & PF_ALLINDS) && array_p (var))
|
||||
tt = temp = array_empty (array_cell (var)) ? (char *)NULL : array_to_string (array_cell (var), " ", quoted);
|
||||
else if (assoc_p (var))
|
||||
temp = assoc_reference (assoc_cell (var), "0");
|
||||
else if (array_p (var))
|
||||
temp = array_reference (array_cell (var), 0);
|
||||
@@ -6838,6 +6846,7 @@ expand_arrayref:
|
||||
? quote_string (temp)
|
||||
: ((pflags & PF_ASSIGNRHS) ? quote_rhs (temp)
|
||||
: quote_escapes (temp));
|
||||
FREE (tt);
|
||||
}
|
||||
else
|
||||
temp = (char *)NULL;
|
||||
@@ -8772,17 +8781,18 @@ parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, conta
|
||||
int *indexp, quoted, pflags, *quoted_dollar_atp, *contains_dollar_at;
|
||||
{
|
||||
int check_nullness, var_is_set, var_is_null, var_is_special;
|
||||
int want_substring, want_indir, want_patsub, want_casemod;
|
||||
int want_substring, want_indir, want_patsub, want_casemod, want_attributes;
|
||||
char *name, *value, *temp, *temp1;
|
||||
WORD_DESC *tdesc, *ret;
|
||||
int t_index, sindex, c, tflag, modspec, all_element_arrayref;
|
||||
int t_index, sindex, c, tflag, modspec, local_pflags, all_element_arrayref;
|
||||
intmax_t number;
|
||||
arrayind_t ind;
|
||||
|
||||
temp = temp1 = value = (char *)NULL;
|
||||
var_is_set = var_is_null = var_is_special = check_nullness = 0;
|
||||
want_substring = want_indir = want_patsub = want_casemod = 0;
|
||||
want_substring = want_indir = want_patsub = want_casemod = want_attributes = 0;
|
||||
|
||||
local_pflags = 0;
|
||||
all_element_arrayref = 0;
|
||||
|
||||
sindex = *indexp;
|
||||
@@ -8876,6 +8886,12 @@ parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, conta
|
||||
want_casemod = 1;
|
||||
}
|
||||
#endif
|
||||
else if (c == '@' && (string[sindex] == 'a' || string[sindex] == 'A') && string[sindex+1] == RBRACE)
|
||||
{
|
||||
/* special case because we do not want to shortcut foo as foo[0] here */
|
||||
want_attributes = 1;
|
||||
local_pflags |= PF_ALLINDS;
|
||||
}
|
||||
|
||||
/* Catch the valid and invalid brace expressions that made it through the
|
||||
tests above. */
|
||||
@@ -9043,7 +9059,7 @@ parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, conta
|
||||
|
||||
if (want_indir)
|
||||
{
|
||||
tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, pflags, quoted_dollar_atp, contains_dollar_at);
|
||||
tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, pflags|local_pflags, quoted_dollar_atp, contains_dollar_at);
|
||||
if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal)
|
||||
{
|
||||
temp = (char *)NULL;
|
||||
@@ -9056,7 +9072,10 @@ parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, conta
|
||||
tdesc->flags &= ~W_ARRAYIND;
|
||||
}
|
||||
else
|
||||
tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind);
|
||||
{
|
||||
local_pflags |= PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS));
|
||||
tdesc = parameter_brace_expand_word (name, var_is_special, quoted, local_pflags, &ind);
|
||||
}
|
||||
|
||||
if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal)
|
||||
{
|
||||
|
||||
@@ -708,6 +708,17 @@ aaa bb
|
||||
'a b' 'c d' 'e f'
|
||||
0 "zero" 1 "one" 2 "two" 3 "three"
|
||||
0 "zero z" 1 "one o" 2 "two t" 3 "three t"
|
||||
declare -a foo=()
|
||||
ai
|
||||
declare -ai foo
|
||||
bash: line 1: foo: unbound variable
|
||||
ai
|
||||
declare -ai foo
|
||||
bash: line 1: !bar: unbound variable
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
argv[1] = </>
|
||||
argv[1] = </>
|
||||
|
||||
|
||||
@@ -628,6 +628,9 @@ ${THIS_SH} ./new-exp13.sub
|
||||
# new K parameter transformation operator
|
||||
${THIS_SH} ./new-exp14.sub
|
||||
|
||||
# ongoing work with a/A parameter transformations and `nounset'
|
||||
${THIS_SH} ./new-exp15.sub
|
||||
|
||||
# problems with stray CTLNUL in bash-4.0-alpha
|
||||
unset a
|
||||
a=/a
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
: ${THIS_SH:=./bash}
|
||||
|
||||
${THIS_SH} -c 'declare -a foo=() ; declare -p foo' bash
|
||||
|
||||
${THIS_SH} -c 'declare -ia foo=() ; echo ${foo@a} ; echo ${foo@A}' bash
|
||||
${THIS_SH} -uc 'declare -ia foo=() ; echo ${foo@a} ; echo ${foo@A}' bash
|
||||
|
||||
${THIS_SH} -c 'declare -ia foo=() ; bar=foo; echo ${!bar@a} ; echo ${!bar@A}' bash
|
||||
${THIS_SH} -uc 'declare -ia foo=() ; bar=foo; echo ${!bar@a} ; echo ${!bar@A}' bash
|
||||
|
||||
${THIS_SH} -c 'declare -a foo=( [1]=one ) ; echo ${foo@a}' bash
|
||||
${THIS_SH} -uc 'declare -a foo=( [1]=one ) ; echo ${foo@a}' bash
|
||||
|
||||
${THIS_SH} -c 'declare -a foo=( [1]=one ) ; bar=foo; echo ${!bar@a}' bash
|
||||
${THIS_SH} -uc 'declare -a foo=( [1]=one ) ; bar=foo; echo ${!bar@a}' bash
|
||||
Reference in New Issue
Block a user