lib/readline/doc/rltech.texi
- rl_reparse_colors: document as public function
+
+ 9/21
+ ----
+pcomplete.c
+ - it_init_aliases: move the free (alias_list) inside #ifdef ALIAS.
+ Report and fix from Mike Jonkmans <bashbug@jonkmans.nl>
+
+redir.c
+ - redirection_error: set W_NOPROCSUB in the word redirection_error
+ creates to call redirection_expand
+
+builtins/bind.def
+ - bind_builtin: use CASE_HELPOPT so the long doc gets printed when
+ --help is supplied
+
+builtins/getopts.def
+ - getopts_builtin: change to use no_options()
+
+ 9/22
+ ----
+execute_cmd.c
+ - execute_select_command: in posix mode, an invalid selection variable
+ name is a fatal error, just like with `for'. This is compatible with
+ ksh93 and mksh
+
tests/arith6.sub f
tests/arith7.sub f
tests/arith8.sub f
+tests/arith9.sub f
tests/array.tests f
tests/array.right f
tests/array1.sub f
tests/builtins6.sub f
tests/builtins7.sub f
tests/builtins8.sub f
+tests/builtins9.sub f
tests/source1.sub f
tests/source2.sub f
tests/source3.sub f
tests/comsub-posix6.sub f
tests/cond.tests f
tests/cond.right f
+tests/cond-error1.sub f
tests/cond-regexp1.sub f
tests/cond-regexp2.sub f
tests/cond-regexp3.sub f
+tests/cond-xtrace1.sub f
tests/coproc.tests f
tests/coproc.right f
tests/cprint.tests f
tests/glob8.sub f
tests/glob9.sub f
tests/glob10.sub f
+tests/glob11.sub f
tests/glob.right f
tests/globstar.tests f
tests/globstar.right f
tests/intl3.sub f
tests/intl4.sub f
tests/intl.right f
+tests/invocation.tests f
+tests/invocation.right f
tests/iquote.tests f
tests/iquote.right f
tests/iquote1.sub f
tests/run-ifs-posix f
tests/run-input-test f
tests/run-intl f
+tests/run-invocation f
tests/run-iquote f
tests/run-invert f
tests/run-jobs f
tests/trap5.sub f
tests/trap6.sub f
tests/trap7.sub f
+tests/trap8.sub f
tests/type.tests f
tests/type.right f
tests/type1.sub f
case 'X':
flags |= XXFLAG;
break;
- case GETOPT_HELP:
+ CASE_HELPOPT;
default:
builtin_usage ();
BIND_RETURN (EX_USAGE);
#define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN | (use_standard_path ? CMD_STDPATH : 0))
+ /* This code isn't executed any more; look at execute_cmd.c:execute_simple_command()
+ where command is treated as a pseudo-reserved prefix so we can optimize
+ away forks where possible. */
+
/* We don't want this to be reparsed (consider command echo 'foo &'), so
just make a simple_command structure and call execute_command with it. */
command = make_bare_simple_command (line_number);
add_unwind_protect (uw_dispose_command, command);
result = execute_command (command);
+ dispose_command (command);
- run_unwind_frame ("command_builtin");
-
+ discard_unwind_frame ("command_builtin");
return (result);
}
char **av;
int ac, ret;
+ if (no_options (list))
+ return (EX_USAGE);
+ list = loptend; /* skip over possible `--' */
+
if (list == 0)
{
builtin_usage ();
return EX_USAGE;
}
- reset_internal_getopt ();
- if ((ret = internal_getopt (list, "")) != -1)
- {
- if (ret == GETOPT_HELP)
- builtin_help ();
- else
- builtin_usage ();
- return (EX_USAGE);
- }
- list = loptend;
-
av = make_builtin_argv (list, &ac);
ret = dogetopts (ac, av);
free ((char *)av);
@item
A non-interactive shell exits with an error status if the iteration
variable in a @code{for} statement or the selection variable in a
-@code{select} statement is a readonly variable.
+@code{select} statement is a readonly variable or has an invalid name.
@item
Non-interactive shells exit if @var{filename} in @code{.} @var{filename}
int retval, list_len, show_menu, save_line_number;
if (check_identifier (select_command->name, 1) == 0)
- return (EXECUTION_FAILURE);
+ {
+ if (posixly_correct && interactive_shell == 0)
+ {
+ last_command_exit_value = EX_BADUSAGE;
+ jump_to_top_level (ERREXIT);
+ }
+ return (EXECUTION_FAILURE);
+ }
save_line_number = line_number;
line_number = select_command->line;
sl->list[n] = (char *)NULL;
sl->list_size = sl->list_len = n;
itp->slist = sl;
+ free (alias_list);
#else
itp->slist = (STRINGLIST *)NULL;
#endif
- free (alias_list);
return 1;
}
oflags = temp->redirectee.filename->flags;
if (posixly_correct && interactive_shell == 0)
temp->redirectee.filename->flags |= W_NOGLOB;
- temp->redirectee.filename->flags |= W_NOCOMSUB;
+ temp->redirectee.filename->flags |= W_NOCOMSUB|W_NOPROCSUB;
filename = allocname = redirection_expand (temp->redirectee.filename);
temp->redirectee.filename->flags = oflags;
if (filename == 0)
alias: 0
alias: 0
./alias.tests: line 38: qfoo: command not found
+./alias.tests: line 44: unalias: foo: not found
quux
hi
declare -a m=([0]="x")
unalias qfoo qbar qbaz quux
unalias -a
+# error
+unalias foo
alias foo='echo '
alias bar=baz
1
1
32
+32
4
20
1,i+=2
1,i+=2
30
1,j+=2
-./arith.tests: line 127: 1 ? 20 : x+=2: attempted assignment to non-variable (error token is "+=2")
+./arith.tests: line 129: 1 ? 20 : x+=2: attempted assignment to non-variable (error token is "+=2")
20
6
6,5,3
127
36
40
+40
+40
10
10
10
36
62
63
-./arith.tests: line 162: 3425#56: invalid arithmetic base (error token is "3425#56")
-./arith.tests: line 165: 2#: invalid integer constant (error token is "2#")
-./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: 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")
+./arith.tests: line 168: 3425#56: invalid arithmetic base (error token is "3425#56")
+./arith.tests: line 171: 2#: invalid integer constant (error token is "2#")
+./arith.tests: line 174: 7 = 43 : attempted assignment to non-variable (error token is "= 43 ")
+./arith.tests: line 175: 2#44: value too great for base (error token is "2#44")
+./arith.tests: line 176: 44 / 0 : division by 0 (error token is "0 ")
+./arith.tests: line 177: let: jv += $iv: arithmetic syntax error: operand expected (error token is "$iv")
+./arith.tests: line 178: jv += $iv : arithmetic syntax error: operand expected (error token is "$iv ")
+./arith.tests: line 179: let: rv = 7 + (43 * 6: missing `)' (error token is "6")
+./arith.tests: line 182: b / 0 : division by 0 (error token is "0 ")
+./arith.tests: line 183: b /= 0 : division by 0 (error token is "0 ")
+./arith.tests: line 188: 0#4: invalid number (error token is "0#4")
+./arith.tests: line 189: 2#110#11: invalid number (error token is "2#110#11")
abc
def
ghi
6
1
0
-./arith.tests: line 196: 4 + : arithmetic syntax error: operand expected (error token is "+ ")
+./arith.tests: line 207: 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 ")
-./arith.tests: line 203: 4 ? 20 : : expression expected (error token is ": ")
+./arith.tests: line 212: 4 ? : 3 + 5 : expression expected (error token is ": 3 + 5 ")
+./arith.tests: line 213: 1 ? 20 : `:' expected for conditional expression (error token is "20 ")
+./arith.tests: line 214: 4 ? 20 : : expression expected (error token is ": ")
9
-./arith.tests: line 209: 0 && B=42 : attempted assignment to non-variable (error token is "=42 ")
+./arith.tests: line 220: 0 && B=42 : attempted assignment to non-variable (error token is "=42 ")
9
-./arith.tests: line 212: 1 || B=88 : attempted assignment to non-variable (error token is "=88 ")
+./arith.tests: line 223: 1 || B=88 : attempted assignment to non-variable (error token is "=88 ")
9
0
9
131072
2147483647
1
+./arith.tests: line 255: 2**-1 : exponent less than 0 (error token is "1 ")
4
4
5
4
4
7
-./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 ")
-./arith.tests: line 266: x--=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: line 274: 7-- : arithmetic syntax error: operand expected (error token is "- ")
+./arith.tests: line 276: --x=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: line 277: ++x=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: line 279: x++=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: line 280: x--=7 : attempted assignment to non-variable (error token is "=7 ")
4
7
-7
7
7
+./arith.tests: line 292: --x++ : ++: assignment requires lvalue (error token is "++ ")
2
2
./arith1.sub: line 15: 4-- : arithmetic syntax error: operand expected (error token is "- ")
0
0
0
+./arith9.sub: line 4: a: unbound variable
+./arith9.sub: line 5: a: unbound variable
+0
+after 3 0
+0
+after 4 0
+./arith9.sub: line 14: b: expression recursion level exceeded (error token is "b")
++ var=42
++ echo 42
+42
++ echo 0
+0
++ echo 0
+0
++ echo 0
+0
++ (( 42 ))
++ echo 0
+0
++ (( ))
++ echo 1
+1
++ set +x
+./arith9.sub: line 37: 4+: arithmetic syntax error: operand expected (error token is "+")
+x = 4+ y =
8 12
-./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")
+./arith.tests: line 332: ((: x=9 y=41 : arithmetic syntax error in expression (error token is "y=41 ")
+./arith.tests: line 336: a b: arithmetic syntax error in expression (error token is "b")
+./arith.tests: line 337: ((: a b: arithmetic syntax error in expression (error token is "b")
42
42
42
42
42
42
-./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")
+./arith.tests: line 352: 'foo' : arithmetic syntax error: operand expected (error token is "'foo' ")
+./arith.tests: line 355: b[c]d: arithmetic syntax error in expression (error token is "d")
echo $(( (2+2)<(2+3) ? 1 : 32))
echo $(( (2+2)>(2+3) ? 1 : 32))
+echo $(( (2+2)>(2+3) ? 2**0 : 32))
+
# bug in bash versions through bash-3.2
S=105
W=$((S>99?4:S>9?3:S>0?2:0))
echo $(( 8#44 ))
echo $(( 8 ^ 32 ))
+a=8
+echo $(( a ^ 32 ))
+echo $(( a ^= 32 ))
+unset -v a
# other bases
echo $(( 16#a ))
echo $(( jv += \$iv ))
let 'rv = 7 + (43 * 6'
+b=44
+echo $(( b / 0 ))
+echo $(( b /= 0 ))
+unset -v b
+
# more errors
declare -i i
i=0#4
echo $(( 2**31-1))
echo $(( 2**0 ))
+# error
+echo $(( 2**-1 ))
+
# {pre,post}-{inc,dec}rement and associated errors
x=4
echo $(( ++7 ))
echo $(( --7 ))
+unset -v x
+x=8
+echo $(( --x++ )) # error
+unset -v x
+
# combinations of expansions
echo $(( "`echo 1+1`" ))
echo $(( `echo 1+1` ))
# problems with evaluation of conditional expressions
${THIS_SH} ./arith8.sub
+# expressions with unset variables and nounset enabled
+${THIS_SH} ./arith9.sub
+
x=4
y=7
--- /dev/null
+# test expression evaluation with unset variables
+set -u
+
+( echo $(( a > 4 )) ; echo after 1 ) # error
+( echo $(( a[0] > 4 )); echo after 2) # error
+
+set +u
+( echo $(( a > 4 )) ; echo after 3 $? )
+( echo $(( a[0] > 4 )); echo after 4 $?)
+
+# this is a recursion stack error
+a=b
+b=a
+echo $(( a + 7 ))
+
+# make sure command printing works for arithmetic expansions and commands
+set -x
+var=42
+
+echo $(( $var ))
+echo $?
+
+echo $(( $null ))
+echo $?
+
+(( $var ))
+echo $?
+
+(( $null ))
+echo $?
+
+set +x
+
+# invalid expressions in different cases
+x=4+
+declare -i x
+x+=7 y=4
+echo x = $x y = $y
bar: element zero: ok
qux: unset array: ok
qux: unset array element 0: ok
+1
+0
+0
+0
2
2
2
typeset -a qux
[[ -v qux ]] || echo qux: unset array: ok
[[ -v qux[0] ]] || echo qux: unset array element 0: ok
+
+unset -v a
+a[1]=set
+
+[[ -v a ]] ; echo $?
+[[ -v a[1] ]] ; echo $?
+[[ -v a[@] ]] ; echo $?
+
+[[ ${#a[@]} > 0 ]]; echo $?
a c e g i k m o q s u w y
z x v t r p n l j h f d b
2147483645 2147483646 2147483647 2147483648 2147483649
+00 01 02 03 04 05 06 07 08 09 10
+00 02 04 06 08 10
10 8 6 4 2 0
10 8 6 4 2 0
-50 -45 -40 -35 -30 -25 -20 -15 -10 -5 0
# make sure brace expansion handles ints > 2**31 - 1 using intmax_t
echo {2147483645..2147483649}
+# want zero-padding here
+echo {00..10}
+echo {00..10..2}
+
# unwanted zero-padding -- fixed post-bash-4.0
echo {10..0..2}
echo {10..0..-2}
u=rwx,g=rwx,o=rwx
u=rwx,g=rx,o=rx
u=rwx,g=rx,o=rx
-./builtins.tests: line 287: exit: status: numeric argument required
+hash: hash table empty
+./builtins9.sub: line 19: hash: notthere: not found
+1
+/nosuchdir/nosuchfile
+builtin hash -p /nosuchdir/nosuchfile cat
+builtin hash -p /nosuchdir/nosuchfile cat
+./builtins9.sub: line 30: hash: notthere: not found
+./builtins9.sub: line 32: hash: notthere: not found
+./builtins9.sub: line 33: hash: notthere: not found
+1
+./builtins9.sub: line 40: /nosuchdir/nosuchfile: No such file or directory
+127
+/nosuchdir/nosuchfile
+0
+0
+found
+./builtins9.sub: line 52: hash: /: Is a directory
+./builtins.tests: line 290: exit: status: numeric argument required
# POSIX complete symbolic umask tests
${THIS_SH} ./builtins8.sub
+# hash tests
+${THIS_SH} ./builtins9.sub
+
# this must be last -- it is a fatal error
exit status
+# 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/>.
+#
+
umask 022
umask u=r+w
umask -S
umask 022
umask a+xr
umask -S
-
-
-
--- /dev/null
+# 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/>.
+#
+
+# hash printing, deleting tests
+hash -r # start with empty hash table
+hash # should be error/warning
+
+hash -d notthere
+echo $?
+
+hash -p /nosuchdir/nosuchfile cat
+
+hash -t cat
+hash -lt cat
+hash -l
+
+hash -d cat
+
+hash -d notthere
+
+hash -lt notthere
+hash -t notthere
+
+hash -t cat 2>/dev/null
+echo $?
+
+# this should fail
+hash -p /nosuchdir/nosuchfile cat
+cat </dev/null
+echo $?
+hash -t cat
+echo $?
+
+# but with checkhash set, it should not
+shopt -s checkhash
+cat </dev/null
+echo $?
+{ hash -t cat | grep cat >/dev/null; } && echo found
+
+hash -r
+hash -p / root
-./comsub-eof0.sub: line 5: warning: here-document at line 3 delimited by end-of-file (wanted `EOF')
+./comsub-eof0.sub: line 4: warning: here-document at line 2 delimited by end-of-file (wanted `EOF')
+hi
+./comsub-eof0.sub: line 11: warning: here-document at line 9 delimited by end-of-file (wanted `EOF')
hi
hi
./comsub-eof2.sub: line 2: warning: here-document at line 1 delimited by end-of-file (wanted `EOF')
+# this works as it should, but with a warning
+foo=$(cat <<EOF
+hi
+EOF)
+echo $foo
+unset -v foo
# it's only the space before the paren that makes this an error
# when I fix it, it will show up here
foo=$(cat <<EOF
argv[1] = <foobar>
argv[1] = <foo\^Jbar>
nested
+blank ----
+blank ----
+blank ----
+blank ----
#esac
a
ok 1
)
)
+# empty comsubs, fork and nofork
+echo blank --$(
+)--
+echo blank --$()--
+
+echo blank --${
+}--
+echo blank --${ }--
+
+
BUILDDIR=/builds/test
read << EOC
Dir: ${BUILDDIR#<(echo a)/}
--- /dev/null
+: ${THIS_SH:=./bash}
+
+# all parse errors
+${THIS_SH} -c '[[ ( -n xx' bash
+${THIS_SH} -c '[[ ( -n xx )' bash
+
+${THIS_SH} -c '[[ ( -t X ) ]' bash
+
+${THIS_SH} -c '[[ -n &' bash
+${THIS_SH} -c '[[ -n XX &' bash
+${THIS_SH} -c '[[ -n XX & ]' bash
+
+${THIS_SH} -c '[[ 4 & ]]' bash
+${THIS_SH} -c '[[ 4 > & ]]' bash
+
+${THIS_SH} -c '[[ & ]]' bash
+${THIS_SH} -c '[[ -Q 7 ]]' bash
+${THIS_SH} -c '[[ -n < ]]' bash
+
+
--- /dev/null
+# printing conditional commands for xtrace
+
+set -x
+
+# error
+[[ -t X ]]
+# null operand
+[[ $b > 7 ]]
+
+# successful unary operator
+[[ -n X ]]
+
+# successful binary operator
+ivar=42
+[[ $ivar -eq 42 ]]
+
+# compound operator, displayed as two unary expressions
+
+[[ -n a && -n b ]]
ok 6
ok 7
ok 8
+bash: -c: line 1: unexpected token `EOF', expected `)'
+bash: -c: line 2: syntax error: unexpected end of file
+bash: -c: line 1: unexpected EOF while looking for `]]'
+bash: -c: line 2: syntax error: unexpected end of file
+bash: -c: line 1: syntax error in conditional expression
+bash: -c: line 1: syntax error near `]'
+bash: -c: line 1: `[[ ( -t X ) ]'
+bash: -c: line 1: unexpected argument `&' to conditional unary operator
+bash: -c: line 1: syntax error near `&'
+bash: -c: line 1: `[[ -n &'
+bash: -c: line 1: syntax error in conditional expression: unexpected token `&'
+bash: -c: line 1: syntax error near `&'
+bash: -c: line 1: `[[ -n XX &'
+bash: -c: line 1: syntax error in conditional expression: unexpected token `&'
+bash: -c: line 1: syntax error near `&'
+bash: -c: line 1: `[[ -n XX & ]'
+bash: -c: line 1: unexpected token `&', conditional binary operator expected
+bash: -c: line 1: syntax error near `&'
+bash: -c: line 1: `[[ 4 & ]]'
+bash: -c: line 1: unexpected argument `&' to conditional binary operator
+bash: -c: line 1: syntax error near `&'
+bash: -c: line 1: `[[ 4 > & ]]'
+bash: -c: line 1: unexpected token `&' in conditional command
+bash: -c: line 1: syntax error near `&'
+bash: -c: line 1: `[[ & ]]'
+bash: -c: line 1: conditional binary operator expected
+bash: -c: line 1: syntax error near `7'
+bash: -c: line 1: `[[ -Q 7 ]]'
+bash: -c: line 1: unexpected argument `<' to conditional unary operator
+bash: -c: line 1: syntax error near `<'
+bash: -c: line 1: `[[ -n < ]]'
++ [[ -t X ]]
+./cond-xtrace1.sub: line 6: [[: X: integer expected
++ [[ '' > 7 ]]
++ [[ -n X ]]
++ ivar=42
++ [[ 42 -eq 42 ]]
++ [[ -n a ]]
++ [[ -n b ]]
if [[ str ]] then [[ str ]] fi
${THIS_SH} ./cond-regexp1.sub
-
${THIS_SH} ./cond-regexp2.sub
-
${THIS_SH} ./cond-regexp3.sub
+
+${THIS_SH} ./cond-error1.sub
+${THIS_SH} ./cond-xtrace1.sub
./errors.tests: line 32: alias: hoowah: not found
./errors.tests: line 33: unalias: hoowah: not found
./errors.tests: line 36: `1': not a valid identifier
+./errors.tests: line 37: `f\1': not a valid identifier
+./errors.tests: line 41: `invalid-name': not a valid identifier
+./errors.tests: line 43: `f\1': not a valid identifier
+./errors.tests: line 46: `1': not a valid identifier
+./errors.tests: line 47: `f\1': not a valid identifier
+./errors.tests: line 48: `invalid-name': not a valid identifier
+./errors.tests: line 50: `1': not a valid identifier
+./errors.tests: line 51: `f\1': not a valid identifier
declare -fr func
-./errors.tests: line 49: func: readonly function
-./errors.tests: line 52: unset: -x: invalid option
+./errors.tests: line 64: func: readonly function
+./errors.tests: line 67: unset: -x: invalid option
unset: usage: unset [-f] [-v] [-n] [name ...]
-./errors.tests: line 55: unset: func: cannot unset: readonly function
-./errors.tests: line 58: declare: func: readonly function
-./errors.tests: line 62: declare: -a: invalid option
-./errors.tests: line 63: declare: -i: invalid option
-./errors.tests: line 67: unset: XPATH: cannot unset: readonly variable
-./errors.tests: line 73: unset: cannot simultaneously unset a function and a variable
-./errors.tests: line 76: declare: -z: invalid option
+./errors.tests: line 70: unset: func: cannot unset: readonly function
+./errors.tests: line 73: declare: func: readonly function
+./errors.tests: line 77: declare: -a: invalid option
+./errors.tests: line 78: declare: -i: invalid option
+./errors.tests: line 82: unset: XPATH: cannot unset: readonly variable
+./errors.tests: line 88: unset: cannot simultaneously unset a function and a variable
+./errors.tests: line 91: declare: -z: invalid option
declare: usage: declare [-aAfFgiIlnrtux] [name[=value] ...] or declare -p [-aAfFilnrtux] [name ...]
-./errors.tests: line 78: declare: `-z': not a valid identifier
-./errors.tests: line 79: declare: `/bin/sh': not a valid identifier
-./errors.tests: line 83: declare: cannot use `-f' to make functions
-./errors.tests: line 86: exec: -i: invalid option
+./errors.tests: line 93: declare: `-z': not a valid identifier
+./errors.tests: line 94: declare: `/bin/sh': not a valid identifier
+./errors.tests: line 98: declare: cannot use `-f' to make functions
+./errors.tests: line 101: exec: -i: invalid option
exec: usage: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
-./errors.tests: line 90: export: XPATH: not a function
-./errors.tests: line 93: break: only meaningful in a `for', `while', or `until' loop
-./errors.tests: line 94: continue: only meaningful in a `for', `while', or `until' loop
-./errors.tests: line 97: shift: label: numeric argument required
-./errors.tests: line 102: shift: too many arguments
-./errors.tests: line 108: let: expression expected
-./errors.tests: line 111: local: can only be used in a function
-./errors.tests: line 114: logout: not login shell: use `exit'
-./errors.tests: line 117: hash: notthere: not found
-./errors.tests: line 120: hash: -v: invalid option
+./errors.tests: line 105: export: XPATH: not a function
+./errors.tests: line 108: break: only meaningful in a `for', `while', or `until' loop
+./errors.tests: line 109: continue: only meaningful in a `for', `while', or `until' loop
+./errors.tests: line 112: shift: label: numeric argument required
+./errors.tests: line 117: shift: too many arguments
+./errors.tests: line 123: let: expression expected
+./errors.tests: line 126: local: can only be used in a function
+./errors.tests: line 129: logout: not login shell: use `exit'
+./errors.tests: line 132: hash: notthere: not found
+./errors.tests: line 135: hash: -v: invalid option
hash: usage: hash [-lr] [-p pathname] [-dt] [name ...]
-./errors.tests: line 124: hash: hashing disabled
-./errors.tests: line 127: export: `AA[4]': not a valid identifier
-./errors.tests: line 128: readonly: `AA[4]': not a valid identifier
-./errors.tests: line 131: unset: [-2]: bad array subscript
-./errors.tests: line 135: AA: readonly variable
-./errors.tests: line 139: AA: readonly variable
-./errors.tests: line 147: shift: 5: shift count out of range
-./errors.tests: line 148: shift: -2: shift count out of range
-./errors.tests: line 151: shopt: no_such_option: invalid shell option name
-./errors.tests: line 152: shopt: no_such_option: invalid shell option name
-./errors.tests: line 155: umask: 09: octal number out of range
-./errors.tests: line 156: umask: `:': invalid symbolic mode character
-./errors.tests: line 157: umask: `:': invalid symbolic mode operator
-./errors.tests: line 160: umask: -i: invalid option
+./errors.tests: line 139: hash: hashing disabled
+./errors.tests: line 142: export: `AA[4]': not a valid identifier
+./errors.tests: line 143: readonly: `AA[4]': not a valid identifier
+./errors.tests: line 146: unset: [-2]: bad array subscript
+./errors.tests: line 150: AA: readonly variable
+./errors.tests: line 154: AA: readonly variable
+./errors.tests: line 162: shift: 5: shift count out of range
+./errors.tests: line 163: shift: -2: shift count out of range
+./errors.tests: line 166: shopt: no_such_option: invalid shell option name
+./errors.tests: line 167: shopt: no_such_option: invalid shell option name
+./errors.tests: line 170: umask: 09: octal number out of range
+./errors.tests: line 171: umask: `:': invalid symbolic mode character
+./errors.tests: line 172: umask: `:': invalid symbolic mode operator
+./errors.tests: line 175: umask: -i: invalid option
umask: usage: umask [-p] [-S] [mode]
-./errors.tests: line 164: umask: `p': invalid symbolic mode character
-./errors.tests: line 173: VAR: readonly variable
-./errors.tests: line 176: declare: VAR: readonly variable
-./errors.tests: line 177: declare: VAR: readonly variable
-./errors.tests: line 179: declare: unset: not found
-./errors.tests: line 182: VAR: readonly variable
+./errors.tests: line 179: umask: `p': invalid symbolic mode character
+./errors.tests: line 188: VAR: readonly variable
+./errors.tests: line 191: declare: VAR: readonly variable
+./errors.tests: line 192: declare: VAR: readonly variable
+./errors.tests: line 194: declare: unset: not found
+./errors.tests: line 197: VAR: readonly variable
comsub: -c: line 1: syntax error near unexpected token `)'
comsub: -c: line 1: `: $( for z in 1 2 3; do )'
comsub: -c: line 1: syntax error near unexpected token `done'
comsub: -c: line 1: `: $( for z in 1 2 3; done )'
-./errors.tests: line 189: cd: HOME not set
-./errors.tests: line 190: cd: /tmp/xyz.bash: No such file or directory
-./errors.tests: line 192: cd: OLDPWD not set
-./errors.tests: line 193: cd: /bin/sh: Not a directory
-./errors.tests: line 195: cd: /tmp/cd-notthere: No such file or directory
-./errors.tests: line 198: .: filename argument required
+./errors.tests: line 204: cd: HOME not set
+./errors.tests: line 205: cd: /tmp/xyz.bash: No such file or directory
+./errors.tests: line 207: cd: OLDPWD not set
+./errors.tests: line 208: cd: /bin/sh: Not a directory
+./errors.tests: line 210: cd: /tmp/cd-notthere: No such file or directory
+./errors.tests: line 213: .: filename argument required
.: usage: . filename [arguments]
-./errors.tests: line 199: source: filename argument required
+./errors.tests: line 214: source: filename argument required
source: usage: source filename [arguments]
-./errors.tests: line 202: .: -i: invalid option
+./errors.tests: line 217: .: -i: invalid option
.: usage: . filename [arguments]
-./errors.tests: line 205: set: -q: invalid option
+./errors.tests: line 220: set: -q: invalid option
set: usage: set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [arg ...]
-./errors.tests: line 208: enable: sh: not a shell builtin
-./errors.tests: line 208: enable: bash: not a shell builtin
-./errors.tests: line 211: shopt: cannot set and unset shell options simultaneously
-./errors.tests: line 214: read: var: invalid timeout specification
-./errors.tests: line 217: read: `/bin/sh': not a valid identifier
-./errors.tests: line 220: VAR: readonly variable
-./errors.tests: line 223: readonly: -x: invalid option
+./errors.tests: line 223: enable: sh: not a shell builtin
+./errors.tests: line 223: enable: bash: not a shell builtin
+./errors.tests: line 226: shopt: cannot set and unset shell options simultaneously
+./errors.tests: line 229: read: var: invalid timeout specification
+./errors.tests: line 232: read: `/bin/sh': not a valid identifier
+./errors.tests: line 235: VAR: readonly variable
+./errors.tests: line 238: readonly: -x: invalid option
readonly: usage: readonly [-aAf] [name[=value] ...] or readonly -p
-./errors.tests: line 226: eval: -i: invalid option
+./errors.tests: line 241: eval: -i: invalid option
eval: usage: eval [arg ...]
-./errors.tests: line 227: command: -i: invalid option
+./errors.tests: line 242: command: -i: invalid option
command: usage: command [-pVv] command [arg ...]
-./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
+./errors.tests: line 245: /bin/sh + 0: arithmetic syntax error: operand expected (error token is "/bin/sh + 0")
+./errors.tests: line 246: /bin/sh + 0: arithmetic syntax error: operand expected (error token is "/bin/sh + 0")
+./errors.tests: line 249: trap: NOSIG: invalid signal specification
+./errors.tests: line 252: trap: -s: invalid option
trap: usage: trap [-Plp] [[action] signal_spec ...]
-./errors.tests: line 243: return: can only `return' from a function or sourced script
-./errors.tests: line 247: break: 0: loop count out of range
-./errors.tests: line 251: continue: 0: loop count out of range
-./errors.tests: line 256: builtin: bash: not a shell builtin
-./errors.tests: line 260: bg: no job control
-./errors.tests: line 261: fg: no job control
-./errors.tests: line 264: kill: -s: option requires an argument
-./errors.tests: line 266: kill: S: invalid signal specification
-./errors.tests: line 268: kill: `': not a pid or valid job spec
+./errors.tests: line 258: return: can only `return' from a function or sourced script
+./errors.tests: line 262: break: 0: loop count out of range
+./errors.tests: line 266: continue: 0: loop count out of range
+./errors.tests: line 271: builtin: bash: not a shell builtin
+./errors.tests: line 275: bg: no job control
+./errors.tests: line 276: fg: no job control
+./errors.tests: line 279: kill: -s: option requires an argument
+./errors.tests: line 281: kill: S: invalid signal specification
+./errors.tests: line 283: kill: `': not a pid or valid job spec
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
-./errors.tests: line 273: set: trackall: invalid option name
-./errors.tests: line 277: xx: readonly variable
+./errors.tests: line 288: set: trackall: invalid option name
+./errors.tests: line 289: set: -q: invalid option
+set: usage: set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [arg ...]
+./errors.tests: line 290: set: -i: invalid option
+set: usage: set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [arg ...]
+./errors.tests: line 294: xx: readonly variable
1
./errors1.sub: line 14: .: -i: invalid option
.: usage: . filename [arguments]
2
./errors4.sub: line 20: var: readonly variable
after readonly assignment
-./errors4.sub: line 29: break: x: numeric argument required
+./errors4.sub: line 27: var: readonly variable
+./errors4.sub: line 31: f: readonly variable
+./errors4.sub: line 34: var: readonly variable
+1) 1
+2) 2
+3) 3
+#? ./errors4.sub: line 37: var: readonly variable
+1) 1
+2) 2
+3) 3
+#? ./errors4.sub: line 40: var: readonly variable
+./errors4.sub: line 45: break: x: numeric argument required
1
2
./errors4.sub: line 20: var: readonly variable
sh: line 1: /nosuchfile: No such file or directory
sh: line 1: trap: SIGNOSIG: invalid signal specification
after trap
-./errors.tests: line 316: `!!': not a valid identifier
+./errors.tests: line 333: `!!': not a valid identifier
# the iteration variable must be a valid identifier
for 1 in a b c; do echo $1; done
+for f\1 in a b c ; do echo $f ; done
+
+# in posix mode, it's a fatal error
+(set -o posix
+for invalid-name in a b c; do echo $1; done; echo after posix for)
+(set -o posix
+for f\1 in a b c ; do echo $f ; done; echo after posix for 2)
+
+# same with select
+select 1 in a b c; do echo $REPLY; done
+select f\1 in a b c ; do echo $REPLY ; done
+select invalid-name in a b c; do echo $REPLY; done
+
+(set -o posix ; select 1 in a b c; do echo $REPLY; done; echo after posix select)
+(set -o posix ; select f\1 in a b c ; do echo $REPLY ; done ; echo after posix select 2)
# try to rebind a read-only function
func()
# bad shell option names
set -o trackall # bash is not ksh
+set -q # this is an error
+set -i # this is not allowed
# problem with versions through bash-4.2
readonly xx=5
done
echo after readonly assignment
+# can't have the variable in a for command be readonly
+for var in 1 2 3 4 5; do echo $var; done
+
+# but in posix mode these are fatal errors
+(set -o posix
+for f in 1 2 3 4; do readonly f; done ; echo after for readonly assignment)
+
+(set -o posix
+for var in 1 2 3 4; do echo $var; done; echo after posix for readonly variable)
+
+# same with select
+select var in 1 2 3; do echo $REPLY; done <<<1
+
+(set -o posix
+select var in 1 2 3; do echo $REPLY; done <<<1 ; echo after posix select readonly variable)
+
# non-numeric arguments to break are fatal errors for all non-interactive shells
for f in 1 2 3 4 5
do
.a .aa .b .bb a aa b bb
.a .aa .b .bb
. .. .a .aa .b .bb
+mailcheck.o make_cmd.o mksignames mksignames.o mksyntax mksyntax.dSYM
+
+mailcheck.o make_cmd.o mksignames mksignames.o mksyntax mksyntax.dSYM
+mksyntax.dSYM mksyntax mksignames.o mksignames make_cmd.o mailcheck.o
+
+mailcheck.o make_cmd.o mksignames mksignames.o mksyntax mksyntax.dSYM
+mailcheck.o make_cmd.o mksignames mksignames.o mksyntax mksyntax.dSYM
+
+mksyntax mksignames make_cmd.o mailcheck.o mksignames.o mksyntax.dSYM
+mksyntax.dSYM mksignames.o mailcheck.o make_cmd.o mksignames mksyntax
+
+mksyntax mksignames make_cmd.o mailcheck.o mksignames.o mksyntax.dSYM
+mksyntax.dSYM mksignames.o mailcheck.o make_cmd.o mksignames mksyntax
+
+mksyntax mksignames make_cmd.o mailcheck.o mksignames.o mksyntax.dSYM
+mksyntax.dSYM mksignames.o mailcheck.o make_cmd.o mksignames mksyntax
argv[1] = <a>
argv[2] = <abc>
argv[3] = <abd>
argv[3] = <abd>
argv[4] = <abe>
tmp/l1 tmp/l2 tmp/*4 tmp/l3
-./glob.tests: line 66: no match: tmp/*4
+./glob.tests: line 67: no match: tmp/*4
argv[1] = <bdir/>
argv[1] = <*>
argv[1] = <a*>
${THIS_SH} ./glob8.sub
${THIS_SH} ./glob9.sub
${THIS_SH} ./glob10.sub
+${THIS_SH} ./glob11.sub
MYDIR=$PWD # save where we are
--- /dev/null
+# 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/>.
+#
+
+# testing GLOBSORT
+LC_COLLATE=C
+LC_CTYPE=C
+LANG=C
+
+: ${TMPDIR:=/tmp}
+
+TDIR=$TMPDIR/glob-$$
+{ mkdir $TDIR && cd $TDIR; } || exit 1
+
+# try to impose some kind of testable ordering
+echo 123 > mksyntax ; sleep 0.1
+echo 123456 > mksignames ; sleep 0.1
+echo 1234567879 > make_cmd.o ; sleep 0.1
+echo 123456789012 > mailcheck.o ; sleep 0.1
+echo 123456789012345 > mksignames.o ; sleep 0.1
+echo 123456789012345678 > mksyntax.dSYM ; sleep 0.1
+
+echo m*
+GLOBSORT=nosort
+#echo m* # might have to take this one out
+unset GLOBSORT
+echo
+
+GLOBSORT=
+echo m*
+GLOBSORT='-name'
+echo m*
+echo
+
+GLOBSORT='+nonsense'
+echo m*
+GLOBSORT='-nonsense'
+echo m*
+echo
+
+GLOBSORT='+atime'
+echo m*
+GLOBSORT='-atime'
+echo m*
+echo
+
+GLOBSORT='+mtime'
+echo m*
+GLOBSORT='-mtime'
+echo m*
+echo
+
+GLOBSORT=size
+echo m*
+GLOBSORT=-size
+echo m*
+
+cd $OLDPWD
+rm -rf $TDIR
there
EO\
F
+line 1line 2
hi
hi
+nextEOF
tab 1
tab 2
tab 3
abc
def ghi
jkl mno
+echo "
+echo \"
fff is a function
fff ()
{
done
}
comsub here-string
-./heredoc.tests: line 159: warning: here-document at line 157 delimited by end-of-file (wanted `EOF')
+./heredoc.tests: line 181: warning: here-document at line 178 delimited by end-of-file (wanted `')
hi
there
+''
EOF
true
+# but unquoted here-documents remove backslash-newline
+cat <<EOF
+line 1\
+line 2
+EOF
+
# check that \newline is removed at start of here-doc
cat << EO\
F
EO\
F
+# backslash-newline processing is performed before the check for the delimiter
+cat <<EOF
+next\
+EOF
+EOF
+
# check operation of tab removal in here documents
cat <<- EOF
tab 1
EOF
# check appending of text to file from here document
-rm -f ${TMPDIR}/bash-zzz
-cat > ${TMPDIR}/bash-zzz << EOF
+rm -f ${TMPDIR}/bash-zzz-$$
+cat > ${TMPDIR}/bash-zzz-$$ << EOF
abc
EOF
-cat >> ${TMPDIR}/bash-zzz << EOF
+cat >> ${TMPDIR}/bash-zzz-$$ << EOF
def ghi
jkl mno
EOF
-cat ${TMPDIR}/bash-zzz
-rm -f ${TMPDIR}/bash-zzz
+cat ${TMPDIR}/bash-zzz-$$
+rm -f ${TMPDIR}/bash-zzz-$$
+
+# check behavior of double quotes and backslashes in here-documents
+cat <<EOF
+echo "
+EOF
+
+cat <<EOF
+echo \"
+EOF
# make sure command printing puts the here-document as the last redirection
# on the line, and the function export code preserves syntactic correctness
# check that end of file delimits a here-document
# THIS MUST BE LAST!
-cat << EOF
+cat <<''
hi
there
+''
--- /dev/null
+.: .: Is a directory
+bash: -c: option requires an argument
+bash: --badopt: invalid option
+bash [GNU long option] [option] ...
+bash [GNU long option] [option] script-file ...
+GNU long options:
+ --debug
+ --debugger
+ --dump-po-strings
+ --dump-strings
+ --help
+ --init-file
+ --login
+ --noediting
+ --noprofile
+ --norc
+ --posix
+ --pretty-print
+ --rcfile
+ --restricted
+ --verbose
+ --version
+Shell options:
+ -ilrsD or -c command or -O shopt_option (invocation only)
+ -abefhkmnptuvxBCEHPT or -o option
+bash: --initfile: invalid option
+bash [GNU long option] [option] ...
+bash [GNU long option] [option] script-file ...
+GNU long options:
+ --debug
+ --debugger
+ --dump-po-strings
+ --dump-strings
+ --help
+ --init-file
+ --login
+ --noediting
+ --noprofile
+ --norc
+ --posix
+ --pretty-print
+ --rcfile
+ --restricted
+ --verbose
+ --version
+Shell options:
+ -ilrsD or -c command or -O shopt_option (invocation only)
+ -abefhkmnptuvxBCEHPT or -o option
+bash: -q: invalid option
+bash [GNU long option] [option] ...
+bash [GNU long option] [option] script-file ...
+GNU long options:
+ --debug
+ --debugger
+ --dump-po-strings
+ --dump-strings
+ --help
+ --init-file
+ --login
+ --noediting
+ --noprofile
+ --norc
+ --posix
+ --pretty-print
+ --rcfile
+ --restricted
+ --verbose
+ --version
+Shell options:
+ -ilrsD or -c command or -O shopt_option (invocation only)
+ -abefhkmnptuvxBCEHPT or -o option
+this-bash
+$- for -c includes c
+a
+a
+bad-interp
+./invocation.tests: ./x23: nosuchfile: bad interpreter: No such file or directory
--- /dev/null
+# 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}
+
+# invocation modes and errors
+
+export BASH_ARGV0=this-bash
+
+${THIS_SH} .
+
+#${THIS_SH} --version -c 'exit 0' bash
+#${THIS_SH} --help -c 'exit 0' bash
+
+${THIS_SH} -c |& sed 's|^.*/bash|bash|'
+
+${THIS_SH} --badopt |& sed 's|^.*/bash|bash|'
+${THIS_SH} --initfile |& sed 's|^.*/bash|bash|'
+${THIS_SH} -q |& sed 's|^.*/bash|bash|'
+
+${THIS_SH} -c 'echo $0'
+
+{ ${THIS_SH} -c 'echo $-' bash | grep c >/dev/null; } && echo '$- for -c includes c'
+
+: ${TMPDIR:=/tmp}
+TDIR=$TMPDIR/invocation-$$
+mkdir $TDIR || exit 1
+SAVEPWD=$PWD
+
+# script that ends with a comment and no newline
+printf 'echo a # comment' > $TDIR/x23.in
+${THIS_SH} $TDIR/x23.in
+printf 'echo a' > $TDIR/x23.in
+${THIS_SH} $TDIR/x23.in
+rm -f $TDIR/x23.in
+
+# script with invalid interpreter
+cat > $TDIR/x23 <<EOF
+#! nosuchfile
+echo bad-interp
+EOF
+chmod +x $TDIR/x23
+
+# this is fine
+${THIS_SH} $TDIR/x23
+command cd -L $TDIR
+# but this results in a bad-interpreter error
+./x23
+
+cd $SAVEPWD
+rm -rf $TDIR
real 0.00
user 0.00
sys 0.00
+real 0.00
+user 0.00
+sys 0.00
+4
echo $?
time -p -- echo a
+
+time -- :
+
+# this should print timing information
+. ./test-glue-functions
+
+${THIS_SH} -c '{ time; echo after; }' |& wc -l | _cut_leading_spaces
string \
string \
string \}
+escape\
+escape\
'weferfds'\''dsfsdf'
'weferfdsdsfsdf'
'weferfds'\''dsfsdf'
echo "${foo:-string \\}"
echo ${foo:-string \\\}}
+: ${TMPDIR:=/tmp}
+
+${THIS_SH} -c 'echo escape\'
+printf 'echo escape\' > $TMPDIR/quote-$$
+${THIS_SH} $TMPDIR/quote-$$
+rm -f $TMPDIR/quote-$$
+
${THIS_SH} ./quote1.sub
${THIS_SH} ./quote2.sub
${THIS_SH} ./quote3.sub
abc
def
def
-./redir.tests: line 44: $z: ambiguous redirect
+ghi
+./redir.tests: line 49: -1: ambiguous redirect
+./redir.tests: line 50: exec: -1: invalid option
+exec: usage: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
+./redir.tests: line 55: $z: ambiguous redirect
Point 1
Point 2
to a
ab
cd
cd
-./redir.tests: line 170: redir1.*: No such file or directory
+./redir.tests: line 181: redir1.*: No such file or directory
# 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
set -o noclobber
-#this should be an error
+#this should be an error, so it needs the same fixed filename
echo def > /tmp/redir-test
cat /tmp/redir-test
# but this should succeed
-echo def > /tmp/redir-test-2
-cat /tmp/redir-test-2
+echo def > $TMPDIR/redir-test-2
+cat $TMPDIR/redir-test-2
# and so should this
echo def >| /tmp/redir-test
cat /tmp/redir-test
+# this should work as normal
+echo ghi >| $TMPDIR/redir-test-3
+cat $TMPDIR/redir-test-3
+
set +o noclobber
-rm /tmp/redir-test /tmp/redir-test-2
+rm -f /tmp/redir-test
+rm -f $TMPDIR/redir-test-2 $TMPDIR/redir-test-3
+
+# these are errors
+fd=-1
+exec <&$fd
+exec $fd</dev/null
+unset -v fd
# this should be an error
z="a b"
echo "Point 5"
# clean up before running scripts
-exec 4>&- 5>&- 6<&-
+exec 4>&- 5>&- 6<&$unset- # ksh93 quirk with unset variable
rm -f $TMPDIR/bash-a $TMPDIR/bash-b $TMPDIR/bash-c
--- /dev/null
+${THIS_SH} ./invocation.tests 2>&1 | grep -v '^expect' > ${BASH_TSTOUT}
+diff ${BASH_TSTOUT} invocation.right && rm -f ${BASH_TSTOUT}
if succeeded
AND list succeeded
OR list succeeded
+00 01 02 03 04 05 06 07 08 09
+00 01 02 03 04 05 06 07 08 09
! succeeded
eval succeeded
! eval succeeded -- 1
false || echo OR list succeeded
+# more compound commands containing failing commands
+for (( f=0; f<10; f++ )); do
+ printf '%.2d ' $f
+ false
+done && echo done
+echo
+
+for f in {0..9}; do
+ printf '%.2d ' $f
+ false
+done && echo done
+echo
+
! false
echo ! succeeded
printf "\ntimes:\n"
times
+printf "\ntime standalone:\n"
+{ time ; echo after; } |& wc -l
+
exit 0
after 1
fn
after 2
+before
+after
+CHLD
+CHLD
+CHLD
+CHLD
caught a child death
caught a child death
caught a child death
# eval and ERR trap
${THIS_SH} ./trap7.sub
+# SIGCHLD traps
+${THIS_SH} ./trap8.sub
+
+
#
# show that setting a trap on SIGCHLD is not disastrous.
#
--- /dev/null
+# tests for traps on SIGCHLD and async commands
+
+set -m
+
+trap 'echo CHLD' SIGCHLD
+
+{ echo before ; : ; echo after; } &
+wait
+
+sleep 1 &
+sleep 1 &
+
+sleep 1
+wait
./vredir.tests: line 19: v: readonly variable
./vredir.tests: line 19: v: cannot assign fd to variable
42
+./vredir.tests: line 38: v: readonly variable
+./vredir.tests: line 38: v: cannot assign fd to variable
bar is a function
bar ()
{
exec {stdin}<&${fd[0]}-;
exec {stdout}>&${fd[1]}-
}
-./vredir8.sub: line 12: $fd: Bad file descriptor
+redir 2
+./vredir8.sub: line 33: $fd: Bad file descriptor
+./vredir8.sub: line 38: $fd: Bad file descriptor
type bar
exec {v}>&-
+# errors
readonly v=42
bar
+exec {v}>&1
echo foo 1 2>&1 >&$v | { grep -q '\$v: Bad' || echo 'bad foo 1'; }
echo foo 2 2>&1 >&$v | { grep -q '\$v: Bad' || echo 'bad foo 2'; }
+# 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/>.
+#
+
# test varredir_close
+# these should work fine
+
: {fd}<>/dev/null
echo redir 1 >&$fd
exec {fd}>&-
+: {fd}>&1
+echo redir 2 >&$fd
+exec {fd}>&-
+
shopt -s varredir_close
: {fd}<>/dev/tty
-echo redir 2 >&$fd
+# these should fail with Bad file descriptor errors
+echo redir 3 >&$fd
exec {fd}>&-
+unset fd
+
+: {fd}>&1
+echo redir 4 >&$fd
+unset fd
+