bash-5.1 beta release

This commit is contained in:
Chet Ramey
2020-09-09 15:25:32 -04:00
parent 712f80b0a4
commit 3eb0018e75
195 changed files with 16779 additions and 14645 deletions
+7
View File
@@ -203,6 +203,7 @@ e
'b
b c
$0
declare -a A=([0]="X=a" [1]="b")
t
[3]=abcde r s t u v
e
@@ -756,3 +757,9 @@ declare -A A=(["*"]="X" ["@"]="X" )
./array27.sub: line 69: A[*]: bad array subscript
./array27.sub: line 69: A[@]: bad array subscript
declare -A A
declare -a bug4=([0]="" [1]="5" [2]="" [3]="1" [4]="")
declare -a bug=([0]="" [1]="5" [2]="" [3]="1" [4]="")
declare -a bug2=([0]="")
declare -a bug3=([0]="" [1]="5" [2]="" [3]="1" [4]="")
declare -a not_bug=([0]="no" [1]="nulls")
declare -a workaround=([0]="")
+6
View File
@@ -392,6 +392,11 @@ declare -a x=($0)
declare -a x=(\$0)
echo "${x[@]}"
unset A Z
Z='a b'
A=( X=$Z )
declare -p A
# tests for bash-3.1 problems
${THIS_SH} ./array5.sub
@@ -419,3 +424,4 @@ ${THIS_SH} ./array24.sub
${THIS_SH} ./array25.sub
${THIS_SH} ./array26.sub
${THIS_SH} ./array27.sub
${THIS_SH} ./array28.sub
+30
View File
@@ -0,0 +1,30 @@
# 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/>.
#
# tests for assigning empty string array elements without subscripts
function foo()
{
local bug=("" "5" "" 1 "")
declare -a bug2=("")
declare -ga bug3=("" "5" "" 1 "")
local not_bug=("no" "nulls")
local workaround; workaround=("")
declare -p bug bug2 bug3 not_bug workaround
}
declare -a bug4=("" "5" "" 1 "")
declare -p bug4
foo
+37 -1
View File
@@ -235,4 +235,40 @@ f2 ()
funcs unset:
one-two
two-two
./builtins.tests: line 279: exit: status: numeric argument required
bash: line 1: notthere: No such file or directory
one
bash: line 1: notthere: No such file or directory
two
bash: line 1: .: notthere: file not found
one
bash: line 1: .: notthere: file not found
0
0
0
0
argv[1] = <one>
0
argv[1] = <two>
0
three
0
four
0
./builtins7.sub: line 19: : command not found
127
0
./builtins7.sub: line 27: notthere: No such file or directory
after 1
./builtins7.sub: line 28: notthere: No such file or directory
after 2
type is a shell builtin
+ command -v type
type
+ command command -v type
type
+ command -p command -v type
type
+ command -p -- command -v type
type
+ set +x
./builtins.tests: line 282: exit: status: numeric argument required
+3
View File
@@ -275,6 +275,9 @@ ${THIS_SH} ./builtins5.sub
# test behavior of unset builtin with -f and -v options
${THIS_SH} ./builtins6.sub
# test behavior of command builtin after changing it to a pseudo-keyword
${THIS_SH} ./builtins7.sub
# this must be last -- it is a fatal error
exit status
+38
View File
@@ -0,0 +1,38 @@
: ${THIS_SH:=./bash}
${THIS_SH} -c 'command . notthere ; echo one' bash
${THIS_SH} -c '. notthere ; echo two' bash
${THIS_SH} -o posix -c 'command . notthere ; echo one' bash
${THIS_SH} -o posix -c '. notthere ; echo two' bash
command ; echo $?
command -- ; echo $?
command -p ; echo $?
command -p -- ; echo $?
command recho one; echo $?
command -- recho two; echo $?
command -p echo three; echo $?
command -p -- echo four ; echo $?
command ''
echo $?
command -p
echo $?
${THIS_SH} -c 'set -e ; command false ; echo after' bash
command command command -p . notthere ; echo after 1
command -p command command . notthere ; echo after 2
command -p command -V type
set -x
command -v type
command command -v type
command -p command -v type
command -p -- command -v type
set +x
+63
View File
@@ -0,0 +1,63 @@
complete -f -X '!*.+(ps|PS)' gs
complete -c nice
complete -e printenv
complete -c gdb
complete -f -X '!*.texi*' texi2html
complete -j -P '%' fg
complete -g groupmod
complete -f -X '!*.dvi' dvips
complete -f -X '!*.texi*' texi2dvi
complete -v -S '=' typeset
complete -f .
complete -c nohup
complete -a unalias
complete -g groupdel
complete -A hostname telnet
complete -v -S '=' declare
complete -v -S '=' export
complete -v -S '=' local
complete -v -S '=' readonly
complete -o bashdefault -o filenames -o nospace -F _comp_cd cd
complete -f -X '!*.dvi' xdvi
complete -c type
complete -f ln
complete -f -X '!*.+(gz|tgz)' gunzip
complete -f -X '!*.texi*' makeinfo
complete -u su
complete -j -P '%' jobs
complete -o dirnames -o filenames -o nospace -d popd
complete -A signal trap
complete -o dirnames -o filenames -o nospace -d pushd
complete -f -X '!*.pdf' acroread
complete -v unset
complete -f -X '!*.+(ps|PS)' ghostview
complete -j -W '$(ps -x | tail +2 | cut -c1-5)' -P '%' wait
complete -A hostname rsh
complete -c exec
complete -f -X '!*.Z' zmore
complete -A signal kill
complete -j -P '%' disown
complete -f -X '!*.+(ps|PS)' gs
complete -f -X '!*.+(ps|PS)' gv
complete -f source
complete -c make
complete -A stopped -P '%' bg
complete -f cat
complete -d mkdir
complete -A helptopic help
complete -c eval
complete -f chown
complete -v read
complete -c -k time
complete -f -X '!*.Z' zcat
complete -f gzip
complete -W '"${GROUPS[@]}"' newgrp
complete -f -X '!*.Z' uncompress
complete -d rmdir
complete -A shopt shopt
complete -A hostname ftp
complete -f more
complete -A hostname rlogin
complete -v getopts
complete -f -X '!*.+(gz|tgz)' gzcat
./complete.tests: line 123: complete: notthere: no completion specification
+126
View File
@@ -0,0 +1,126 @@
# Chet Ramey <chet.ramey@case.edu>
#
# Copyright 2002-2020 Chester Ramey
#
# 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 2, or (at your option)
# any later version.
#
# TThis 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, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
complete
# from zsh, just for testing
complete -A stopped -P '%' bg
complete -j -P '%' fg jobs disown
# this is wrong at this point
complete -j -P '%' -W '$(ps -x | tail +2 | cut -c1-5)' wait
complete -c type
complete -a unalias
complete -v getopts read unset
complete -v -S '=' declare export local readonly typeset
complete -f -- . source
complete -A shopt shopt
complete -e printenv
complete -A helptopic help
complete -c nohup exec nice eval
complete -c -k time
complete -A signal trap kill
complete -f chown ln more cat
complete -d mkdir rmdir
complete -f -X '!*.+(gz|tgz)' gunzip gzcat zcat zmore
complete -f -X '!*.Z' uncompress zmore zcat
complete -f gzip
complete -o dirnames -o filenames -o nospace -d pushd popd
_comp_cd()
{
local IFS=$' \t\n' # normalize IFS
local cur _skipdot _cdpath
local i j k
# Tilde expansion, with side effect of expanding tilde to full pathname
case "$2" in
\~*) eval cur="$2" ;;
*) cur=$2 ;;
esac
# no cdpath or absolute pathname -- straight directory completion
if [[ -z "${CDPATH:-}" ]] || [[ "$cur" == @(./*|../*|/*) ]]; then
# compgen prints paths one per line; could also use while loop
IFS=$'\n'
COMPREPLY=( $(compgen -d -- "$cur") )
IFS=$' \t\n'
# CDPATH+directories in the current directory if not in CDPATH
else
IFS=$'\n'
_skipdot=false
# preprocess CDPATH to convert null directory names to .
_cdpath=${CDPATH/#:/.:}
_cdpath=${_cdpath//::/:.:}
_cdpath=${_cdpath/%:/:.}
for i in ${_cdpath//:/$'\n'}; do
if [[ $i -ef . ]]; then _skipdot=true; fi
k="${#COMPREPLY[@]}"
for j in $( compgen -d -- "$i/$cur" ); do
COMPREPLY[k++]=${j#$i/} # cut off directory
done
done
$_skipdot || COMPREPLY+=( $(compgen -d -- "$cur") )
IFS=$' \t\n'
fi
# variable names if appropriate shell option set and no completions
if shopt -q cdable_vars && [[ ${#COMPREPLY[@]} -eq 0 ]]; then
COMPREPLY=( $(compgen -v -- "$cur") )
fi
# append slash to passed directory name that is the only completion.
# readline will not do this if we complete from CDPATH
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
i=${COMPREPLY[0]} # shorthand
if [[ "$cur" == "$i" ]] && [[ "$i" != "*/" ]]; then
COMPREPLY[0]+=/
fi
fi
return 0
}
complete -o filenames -o nospace -o bashdefault -F _comp_cd cd
complete -A hostname rsh telnet rlogin ftp
complete -u su
complete -W '"${GROUPS[@]}"' newgrp
complete -g groupdel groupmod
complete -f -X '!*.+(ps|PS)' gs gv ghostview
complete -f -X '!*.dvi' dvips xdvi
complete -f -X '!*.pdf' acroread
complete -f -X '!*.texi*' makeinfo texi2dvi texi2html
complete -c gdb make
complete -p gs
complete -p
complete -r xdvi
complete -r notthere
complete -r
complete
+4 -1
View File
@@ -194,4 +194,7 @@ ok 4
ok 5
./errors8.sub: line 14: set: notanoption: invalid option name
ok 6
./errors.tests: line 296: `!!': not a valid identifier
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
./errors.tests: line 299: `!!': not a valid identifier
+3
View File
@@ -288,6 +288,9 @@ ${THIS_SH} -o posix ./errors7.sub
${THIS_SH} ./errors8.sub
${THIS_SH} -c 'return ; echo after return' bash
${THIS_SH} -o posix -c 'return ; echo after return' bash
# this must be last!
# in posix mode, a function name must be a valid identifier
# this can't go in posix2.tests, since it causes the shell to exit
+3
View File
@@ -150,6 +150,9 @@ argv[4] = <d>
argv[5] = <e>
a?b?c
a b c
argv[1] = <a>
argv[2] = <b>
argv[3] = <>
argv[1] = <^?>
argv[1] = <^?>
argv[1] = <^?>
+2
View File
@@ -404,6 +404,8 @@ echo ${a//\\?/ }
echo ${a//\?/ }
${THIS_SH} -c 'var=a:b: ; IFS=" :" ; recho $var""' bash
${THIS_SH} ./exp1.sub
${THIS_SH} ./exp2.sub
+26 -3
View File
@@ -97,17 +97,17 @@ line 2 for history
6 HISTFILE=$TMPDIR/newhistory
7 echo displaying \$HISTFILE after history -a
8 cat $HISTFILE
./history.tests: line 89: fc: history specification out of range
14 set -H
./history.tests: line 90: fc: no command found
15 echo line 2 for history
16 unset HISTSIZE
17 unset HISTFILE
18 # now an out-of-range error because of the one=two not found in history
aa ab ac
echo xx xb xc
xx xb xc
echo 44 48 4c
44 48 4c
./history.tests: line 104: fc: no command found
./history.tests: line 105: fc: no command found
aa
bb
cc
@@ -241,3 +241,26 @@ c
d
echo d
d
a
b
c
d
e
f
4 echo d
5 echo e
6 echo f
out of range 1
6 echo f
7 fc -l
8 echo out of range 1
out of range 2
8 echo out of range 1
9 fc -l 502 498
10 echo out of range 2
out of range 3
10 echo out of range 2
11 fc -l 498 502
12 echo out of range 3
out of range 4
13 fc -l 1 99
+1
View File
@@ -86,6 +86,7 @@ unset HISTFILE
fc -l 4
fc -l 4 8
# now an out-of-range error because of the one=two not found in history
fc -l one=two three=four 502
history 4
+2 -1
View File
@@ -14,6 +14,8 @@
HISTFILE=$TMPDIR/newhistory-$$
export HISTFILE
trap 'rm -f $HISTFILE' EXIT
HISTSIZE=32
HISTFILESIZE=32
echo
@@ -43,4 +45,3 @@ echo
printf "$input" | HISTSIZE= HISTFILE= ${THIS_SH} --norc -i 2>/dev/null
echo
printf "$input" | HISTSIZE=6 HISTFILE= ${THIS_SH} --norc -i 2>/dev/null
+22 -1
View File
@@ -14,7 +14,7 @@
trap 'rm -f $HISTFILE' 0 1 2 3 6 15
HISTFILE=$TMPDIR/foohist-$$
HISTFILE=$TMPDIR/fchist-$$
unset HISTIGNORE HISTCONTROL
set -o history
@@ -32,3 +32,24 @@ fc -l -0
echo d
fc -s 0
HISTSIZE=4
history -c
echo a
echo b
echo c
echo d
echo e
echo f
fc -l
echo out of range 1
fc -l 502 498
echo out of range 2
fc -l 498 502
echo out of range 3
fc -l 1 99
# other out-of-range behavior for future work
echo out of range 4
fc -l -20 -40
+18 -15
View File
@@ -32,13 +32,16 @@ i killed it
2: ok 2
2: ok 3
child1 exit status 0
[1]+ Running sleep 20 &
./jobs7.sub: line 5: fg: no current jobs
[1]+ Running sleep 20 &
0
./jobs.tests: line 38: wait: %1: no such job
./jobs.tests: line 43: fg: no job control
./jobs.tests: line 40: wait: %1: no such job
./jobs.tests: line 45: fg: no job control
wait-for-pid
wait-errors
./jobs.tests: line 56: wait: `1-1': not a pid or valid job spec
./jobs.tests: line 57: wait: `-4': not a pid or valid job spec
./jobs.tests: line 58: wait: `1-1': not a pid or valid job spec
./jobs.tests: line 59: wait: `-4': not a pid or valid job spec
wait-for-background-pids
async list wait-for-background-pids
async list wait for child
@@ -47,7 +50,7 @@ wait-when-no-children
posix jobs output
[1]+ Done sleep 1
wait-for-job
./jobs.tests: line 82: wait: %2: no such job
./jobs.tests: line 84: wait: %2: no such job
127
async list wait-for-job
forked
@@ -60,19 +63,19 @@ sleep 2
fg-bg 4
sleep 2
fg-bg 5
./jobs.tests: line 109: fg: %2: no such job
./jobs.tests: line 110: bg: job 1 already in background
./jobs.tests: line 111: fg: %2: no such job
./jobs.tests: line 112: bg: job 1 already in background
fg-bg 6
./jobs.tests: line 117: fg: -s: invalid option
./jobs.tests: line 119: fg: -s: invalid option
fg: usage: fg [job_spec]
./jobs.tests: line 118: bg: -s: invalid option
./jobs.tests: line 120: bg: -s: invalid option
bg: usage: bg [job_spec ...]
./jobs.tests: line 123: disown: -s: invalid option
./jobs.tests: line 125: disown: -s: invalid option
disown: usage: disown [-h] [-ar] [jobspec ... | pid ...]
./jobs.tests: line 127: disown: %1: no such job
./jobs.tests: line 130: disown: %2: no such job
./jobs.tests: line 129: disown: %1: no such job
./jobs.tests: line 132: disown: %2: no such job
wait-for-non-child
./jobs.tests: line 133: wait: pid 1 is not a child of this shell
./jobs.tests: line 135: wait: pid 1 is not a child of this shell
127
3 -- 1 2 3 -- 1 - 2 - 3
[1] Running sleep 300 &
@@ -82,8 +85,8 @@ running jobs:
[1] Running sleep 300 &
[2]- Running sleep 350 &
[3]+ Running sleep 400 &
./jobs.tests: line 150: kill: %4: no such job
./jobs.tests: line 152: jobs: %4: no such job
./jobs.tests: line 152: kill: %4: no such job
./jobs.tests: line 154: jobs: %4: no such job
current job:
[3]+ Running sleep 400 &
previous job:
+2
View File
@@ -31,6 +31,8 @@ ${THIS_SH} ./jobs5.sub
# test out wait -f framework
${THIS_SH} ./jobs6.sub
${THIS_SH} ./jobs7.sub
jobs
echo $?
+6
View File
@@ -0,0 +1,6 @@
# make sure fg in a subshell doesn't try to start a parent's job
set -m
sleep 20 &
echo $(jobs)
echo $(fg %% ; jobs)
kill %1
+12
View File
@@ -482,6 +482,7 @@ argv[1] = <a>
argv[2] = <b>
argv[1] = <>
./new-exp.tests: line 565: $(($# - 2)): substring expression < 0
./new-exp.tests: line 567: -2: substring expression < 0
argv[1] = <bin>
argv[2] = <bin>
argv[3] = <ucb>
@@ -707,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] = </>
+5
View File
@@ -563,6 +563,8 @@ recho "${*:1:0}"
# this is an error -- negative expression
set a
recho ${@:1:$(($# - 2))}
set a b c d e
recho ${@: -3:-2}
XPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
set $( IFS=: ; echo $XPATH )
@@ -626,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
+29
View File
@@ -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
+2
View File
@@ -0,0 +1,2 @@
${THIS_SH} ./complete.tests > ${BASH_TSTOUT} 2>&1
diff ${BASH_TSTOUT} complete.right && rm -f ${BASH_TSTOUT}
+2
View File
@@ -24,3 +24,5 @@ ok 1
ok 2
ok 3
~root
foo=bar:/usr/xyz
foo=bar:~
+4
View File
@@ -85,4 +85,8 @@ USER=root # should exist just about everywhere
echo ~$USER
cd "$wdir"
echo foo=bar:~
set -o posix; echo foo=bar:~
exit 0
+5
View File
@@ -260,6 +260,11 @@ declare -x v="x"
declare -x v="t"
declare -- v
declare -x v
ignoreeof on
ignoreeof off
ignoreeof on
10
match 1
a=z
a=b
a=z
+1
View File
@@ -258,6 +258,7 @@ ${THIS_SH} ./varenv17.sub
${THIS_SH} ./varenv18.sub
${THIS_SH} ./varenv19.sub
${THIS_SH} ./varenv20.sub
${THIS_SH} ./varenv21.sub
# make sure variable scoping is done right
tt() { typeset a=b;echo a=$a; };a=z;echo a=$a;tt;echo a=$a
+48
View File
@@ -0,0 +1,48 @@
# 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 behavior of `local -' inside shell functions
IGNOREEOF=0
shopt -o ignoreeof
f()
{
local -
set +o ignoreeof
shopt -o ignoreeof
}
f
shopt -o ignoreeof
echo $IGNOREEOF
unset -f f
f()
{
local -
set -m -H +B
set -u
}
before="$-|$SHELLOPTS"
f
after="$-|$SHELLOPTS"
case "$after" in
$before) echo match 1 ;;
*) echo bad 1 ;;
esac
unset -f f