summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/arith-for.right72
-rw-r--r--tests/arith-for.tests87
-rw-r--r--tests/arith.right24
-rw-r--r--tests/arith.tests47
-rw-r--r--tests/array.right17
-rw-r--r--tests/array.tests40
-rw-r--r--tests/builtins.right5
-rw-r--r--tests/builtins.tests5
-rw-r--r--tests/builtins1.sub (renamed from tests/builtins.sub1)0
-rw-r--r--tests/builtins2.sub10
-rw-r--r--tests/cprint.right4
-rw-r--r--tests/errors.right4
-rw-r--r--tests/errors.tests10
-rw-r--r--tests/execscript3
-rw-r--r--tests/extglob.tests1
-rw-r--r--tests/extglob2.right70
-rwxr-xr-xtests/extglob2.tests90
-rw-r--r--tests/func.right92
-rw-r--r--tests/func.tests34
-rw-r--r--tests/func1.sub55
-rw-r--r--tests/history.right2
-rw-r--r--tests/invert.right10
-rw-r--r--tests/invert.tests19
-rw-r--r--tests/jobs.right16
-rw-r--r--tests/jobs.tests4
-rw-r--r--tests/jobs3.sub26
-rw-r--r--tests/misc/dev-tcp.tests16
-rw-r--r--tests/misc/read-nchars.tests11
-rw-r--r--tests/misc/wait-bg.tests25
-rw-r--r--tests/more-exp.right4
-rw-r--r--tests/more-exp.tests22
-rw-r--r--tests/new-exp.right44
-rw-r--r--tests/new-exp.tests40
-rw-r--r--tests/new-exp3.sub26
-rw-r--r--tests/nquote.right5
-rw-r--r--tests/nquote.tests17
-rw-r--r--tests/printf.rightbin1182 -> 1241 bytes
-rw-r--r--tests/printf.tests29
-rw-r--r--tests/read.right16
-rw-r--r--tests/read.tests9
-rw-r--r--tests/read1.sub23
-rw-r--r--tests/read2.sub22
-rw-r--r--tests/read3.sub19
-rw-r--r--tests/redir.tests5
-rw-r--r--tests/run-all4
-rw-r--r--tests/run-arith-for2
-rw-r--r--tests/run-extglob24
-rw-r--r--tests/run-invert2
-rw-r--r--tests/run-minimal6
-rw-r--r--tests/run-new-exp3
-rw-r--r--tests/run-read2
-rw-r--r--tests/run-test2
-rw-r--r--tests/shopt.right8
-rw-r--r--tests/shopt.tests1
-rw-r--r--tests/test.right40
-rw-r--r--tests/test.tests (renamed from tests/test-tests)7
-rw-r--r--tests/varenv.right1
-rw-r--r--tests/varenv.sh14
58 files changed, 1145 insertions, 31 deletions
diff --git a/tests/arith-for.right b/tests/arith-for.right
new file mode 100644
index 00000000..f5b43e09
--- /dev/null
+++ b/tests/arith-for.right
@@ -0,0 +1,72 @@
+0
+1
+2
+0
+1
+2
+0
+1
+2
+0
+2
+4
+fx is a function
+fx ()
+{
+ i=0;
+ for (( 1 ; i < 3 ; i++ ))
+ do
+ echo $i;
+ done;
+ for (( i=0 ; 1 ; i++ ))
+ do
+ if (( " i >= 3 " )); then
+ break;
+ fi;
+ echo $i;
+ done;
+ for (( i=0 ; i<3 ; 1 ))
+ do
+ echo $i;
+ (( " i++ " ));
+ done;
+ i=0;
+ for (( 1 ; 1 ; 1 ))
+ do
+ if (( " i > 2 " )); then
+ break;
+ fi;
+ echo $i;
+ (( " i++ " ));
+ done;
+ i=0;
+ for (( 1 ; 1 ; 1 ))
+ do
+ if (( " i > 2 " )); then
+ break;
+ fi;
+ echo $i;
+ (( " i++ " ));
+ done
+}
+0
+1
+2
+0
+1
+2
+0
+1
+2
+0
+1
+2
+0
+1
+2
+./arith-for.tests: line 77: syntax error: arithmetic expression required
+./arith-for.tests: line 77: syntax error: `(( i=0; "i < 3" ))'
+2
+./arith-for.tests: line 83: syntax error: `;' unexpected
+./arith-for.tests: line 83: syntax error: `(( i=0; i < 3; i++; 7 ))'
+2
diff --git a/tests/arith-for.tests b/tests/arith-for.tests
new file mode 100644
index 00000000..1d6da80d
--- /dev/null
+++ b/tests/arith-for.tests
@@ -0,0 +1,87 @@
+fx()
+{
+i=0
+for (( ; i < 3; i++ ))
+do
+ echo $i
+done
+
+for (( i=0; ; i++ ))
+do
+ if (( i >= 3 )); then
+ break;
+ fi
+ echo $i
+done
+
+for (( i=0; i<3; ))
+do
+ echo $i
+ (( i++ ))
+done
+
+i=0
+for (( ; ; ))
+do
+ if (( i > 2 )); then
+ break;
+ fi
+ echo $i;
+ (( i++ ))
+done
+
+i=0
+for ((;;))
+do
+ if (( i > 2 )); then
+ break;
+ fi
+ echo $i;
+ (( i++ ))
+done
+}
+
+for (( i=0; "i < 3" ; i++ ))
+do
+ echo $i
+done
+
+i=0
+for (( ; "i < 3"; i++ ))
+do
+ echo $i
+done
+
+for (( i=0; ; i++ ))
+do
+ if (( i >= 3 )); then
+ break;
+ fi
+ echo $i
+done
+
+for ((i = 0; ;i++ ))
+do
+ echo $i
+ if (( i < 3 )); then
+ (( i++ ))
+ continue;
+ fi
+ break
+done
+
+type fx
+fx
+
+# errors
+for (( i=0; "i < 3" ))
+do
+ echo $i
+done
+echo $?
+
+for (( i=0; i < 3; i++; 7 ))
+do
+ echo $i
+done
+echo $?
diff --git a/tests/arith.right b/tests/arith.right
index c94da8b3..d70ad783 100644
--- a/tests/arith.right
+++ b/tests/arith.right
@@ -120,3 +120,27 @@ ok
131072
2147483647
1
+4
+4
+5
+5
+4
+3
+3
+4
+4
+7
+./arith.tests: 7-- : syntax error: operand expected (error token is " ")
+./arith.tests: --x=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: ++x=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: x++=7 : attempted assignment to non-variable (error token is "=7 ")
+./arith.tests: x--=7 : attempted assignment to non-variable (error token is "=7 ")
+4
+7
+-7
+7
+7
+8 12
+./arith.tests: ((: x=9 y=41 : syntax error in expression (error token is "y=41 ")
+./arith.tests: a b: syntax error in expression (error token is "b")
+./arith.tests: ((: a b: syntax error in expression (error token is "b")
diff --git a/tests/arith.tests b/tests/arith.tests
index d37e77f7..913efbe0 100644
--- a/tests/arith.tests
+++ b/tests/arith.tests
@@ -220,3 +220,50 @@ echo $(( 2**(16-1)))
echo $(( 2**16*2 ))
echo $(( 2**31-1))
echo $(( 2**0 ))
+
+# {pre,post}-{inc,dec}rement and associated errors
+
+x=4
+
+echo $x
+echo $(( x++ ))
+echo $x
+echo $(( x-- ))
+echo $x
+
+echo $(( --x ))
+echo $x
+
+echo $(( ++x ))
+echo $x
+
+echo $(( ++7 ))
+echo $(( 7-- ))
+
+echo $(( --x=7 ))
+echo $(( ++x=7 ))
+
+echo $(( x++=7 ))
+echo $(( x--=7 ))
+
+echo $x
+
+echo $(( +7 ))
+echo $(( -7 ))
+
+echo $(( ++7 ))
+echo $(( --7 ))
+
+x=4
+y=7
+
+(( x=8 , y=12 ))
+
+echo $x $y
+
+# should be an error
+(( x=9 y=41 ))
+
+# These are errors
+echo $((a b))
+((a b))
diff --git a/tests/array.right b/tests/array.right
index 65fb3c9f..2d3c179e 100644
--- a/tests/array.right
+++ b/tests/array.right
@@ -1,3 +1,6 @@
+./array.tests: array assign: line 10: syntax error near unexpected token `&'
+./array.tests: array assign: line 10: `first & second'
+1
abcde
abcde
abcde bdef
@@ -101,3 +104,17 @@ grep [ 123 ] *
length = 3
value = new1 new2 new3
./array.tests: narray: unbound variable
+
+a b c d e f g
+for case if then else
+<> < > !
+12 14 16 18 20
+4414758999202
+./array.tests: array assign: line 257: syntax error near unexpected token `for'
+./array.tests: array assign: line 257: `a b c for case if then else'
+./array.tests: array assign: line 259: syntax error near unexpected token `for'
+./array.tests: array assign: line 259: `for case if then else'
+./array.tests: array assign: line 261: syntax error near unexpected token `<>'
+./array.tests: array assign: line 261: ` <> < > ! '
+./array.tests: array assign: line 262: syntax error near unexpected token `[1]=<>'
+./array.tests: array assign: line 262: ` [1]=<> [2]=< [3]=> [4]=! '
diff --git a/tests/array.tests b/tests/array.tests
index 6e56d5a9..6f23486d 100644
--- a/tests/array.tests
+++ b/tests/array.tests
@@ -6,6 +6,11 @@ set +a
# The calls to egrep -v are to filter out builtin array variables that are
# automatically set and possibly contain values that vary.
+# this should be an error
+test=(first & second)
+echo $?
+unset test
+
# make sure declare -a converts an existing variable to an array
unset a
a=abcde
@@ -220,3 +225,38 @@ echo "value = ${barray[*]}"
# make sure the array code behaves correctly with respect to unset variables
set -u
( echo ${#narray[4]} )
+
+# some old bugs and ksh93 compatibility tests
+set +u
+cd /tmp
+
+touch 1=bar
+foo=([10]="bar")
+echo ${foo[0]}
+rm 1=bar
+
+foo=(a b c d e f g)
+echo ${foo[@]}
+
+# quoted reserved words are ok
+foo=(\for \case \if \then \else)
+echo ${foo[@]}
+
+# quoted metacharacters are ok
+foo=( [1]='<>' [2]='<' [3]='>' [4]='!' )
+echo ${foo[@]}
+
+# numbers are just words when not in a redirection context
+foo=( 12 14 16 18 20 )
+echo ${foo[@]}
+
+foo=( 4414758999202 )
+echo ${foo[@]}
+
+# errors
+foo=(a b c for case if then else)
+
+foo=(for case if then else)
+
+metas=( <> < > ! )
+metas=( [1]=<> [2]=< [3]=> [4]=! )
diff --git a/tests/builtins.right b/tests/builtins.right
index 5ed2b15f..03a509c8 100644
--- a/tests/builtins.right
+++ b/tests/builtins.right
@@ -124,4 +124,9 @@ ok
ok
./builtins.tests: kill: bad signal number: 4096
1
+a\n\n\nb
+a
+
+
+b
./builtins.tests: exit: bad non-numeric arg `status'
diff --git a/tests/builtins.tests b/tests/builtins.tests
index 9073ed55..979a4de0 100644
--- a/tests/builtins.tests
+++ b/tests/builtins.tests
@@ -183,7 +183,7 @@ echo "$@"
echo "$@"
# test out cd and $CDPATH
-${THIS_SH} ./builtins.sub1
+${THIS_SH} ./builtins1.sub
# test behavior of `.' when given a non-existant file argument
${THIS_SH} ./source5.sub
@@ -253,6 +253,9 @@ kill -l 4096
# kill -l NAME should return the signal number
kill -l ${sigone/SIG/}
+# test behavior of shopt xpg_echo
+${THIS_SH} ./builtins2.sub
+
# this must be last -- it is a fatal error
exit status
diff --git a/tests/builtins.sub1 b/tests/builtins1.sub
index 5b797113..5b797113 100644
--- a/tests/builtins.sub1
+++ b/tests/builtins1.sub
diff --git a/tests/builtins2.sub b/tests/builtins2.sub
new file mode 100644
index 00000000..e4cb32ae
--- /dev/null
+++ b/tests/builtins2.sub
@@ -0,0 +1,10 @@
+# test behavior of shopt xpg_echo
+
+USG_ECHO=off
+shopt -q xpg_echo && USG_ECHO=on
+
+shopt -u xpg_echo
+echo 'a\n\n\nb'
+
+shopt -s xpg_echo
+echo 'a\n\n\nb'
diff --git a/tests/cprint.right b/tests/cprint.right
index 6b711b8c..d8d4d282 100644
--- a/tests/cprint.right
+++ b/tests/cprint.right
@@ -55,8 +55,8 @@ tf2 ()
{
( {
time -p echo a | cat - >/dev/null
- } ) 2>&1
-}
+ } )
+} 2>&1
cprint.tests is a regular file
cprint.tests is not a directory
a
diff --git a/tests/errors.right b/tests/errors.right
index 4c49ec92..039b2bf2 100644
--- a/tests/errors.right
+++ b/tests/errors.right
@@ -48,6 +48,7 @@ hash: usage: hash [-r] [-p pathname] [name ...]
./errors.tests: umask: bad symbolic mode operator: :
./errors.tests: umask: illegal option: -i
umask: usage: umask [-p] [-S] [mode]
+./errors.tests: umask: bad character in symbolic mode: u
./errors.tests: VAR: readonly variable
./errors.tests: declare: VAR: readonly variable
./errors.tests: declare: VAR: readonly variable
@@ -71,8 +72,7 @@ source: usage: source filename
./errors.tests: enable: sh: not a shell builtin
./errors.tests: enable: bash: not a shell builtin
./errors.tests: shopt: cannot set and unset shell options simultaneously
-./errors.tests: read: illegal option: -t
-read: usage: read [-r] [-p prompt] [-a array] [-e] [name ...]
+./errors.tests: read: var: invalid timeout specification
./errors.tests: read: `/bin/sh': not a valid identifier
./errors.tests: VAR: readonly variable
./errors.tests: readonly: illegal option: -x
diff --git a/tests/errors.tests b/tests/errors.tests
index ec0c31c2..9311a5dd 100644
--- a/tests/errors.tests
+++ b/tests/errors.tests
@@ -140,6 +140,14 @@ umask -S u:rwx,g:rwx,o:rx >/dev/null # 002
# at some point, this may mean `invert', but for now it is an error
umask -i
+# bad assignments shouldn't change the umask
+mask=$(umask)
+umask g=u
+mask2=$(umask)
+if [ "$mask" != "$mask2" ]; then
+ echo "umask errors change process umask"
+fi
+
# assignment to a readonly variable in environment
VAR=4
readonly VAR
@@ -183,7 +191,7 @@ enable sh bash
# try to set and unset shell options simultaneously
shopt -s -u checkhash
-# someday, this may give `read' a timeout, but for now it is an error
+# this is an error -- bad timeout spec
read -t var < /dev/null
# try to read into an invalid identifier
diff --git a/tests/execscript b/tests/execscript
index 0a13d72f..ed38c8ee 100644
--- a/tests/execscript
+++ b/tests/execscript
@@ -79,3 +79,6 @@ ${THIS_SH} ./exec4.sub
# try exec'ing a command that cannot be found in $PATH
${THIS_SH} ./exec5.sub
+
+# this was a bug in bash versions before bash-2.04
+${THIS_SH} -c 'cat </dev/null | cat >/dev/null' >&-
diff --git a/tests/extglob.tests b/tests/extglob.tests
index a815bab3..b1295c07 100644
--- a/tests/extglob.tests
+++ b/tests/extglob.tests
@@ -329,6 +329,7 @@ rm -rf $TESTDIR
mkdir $TESTDIR
builtin cd $TESTDIR
+LC_COLLATE=C # have to set this; it affects the sorting
touch a.b a,b a:b a-b a\;b a\ b a_b
echo a[^[:alnum:]]b
diff --git a/tests/extglob2.right b/tests/extglob2.right
new file mode 100644
index 00000000..f8a09dfb
--- /dev/null
+++ b/tests/extglob2.right
@@ -0,0 +1,70 @@
+0: [[ fofo = *(f*(o)) ]]
+0: [[ ffo = *(f*(o)) ]]
+0: [[ foooofo = *(f*(o)) ]]
+0: [[ foooofof = *(f*(o)) ]]
+0: [[ fooofoofofooo = *(f*(o)) ]]
+1: [[ foooofof = *(f+(o)) ]]
+1: [[ xfoooofof = *(f*(o)) ]]
+1: [[ foooofofx = *(f*(o)) ]]
+0: [[ ofxoofxo = *(*(of*(o)x)o) ]]
+1: [[ ofooofoofofooo = *(f*(o)) ]]
+0: [[ foooxfooxfoxfooox = *(f*(o)x) ]]
+1: [[ foooxfooxofoxfooox = *(f*(o)x) ]]
+0: [[ foooxfooxfxfooox = *(f*(o)x) ]]
+0: [[ ofxoofxo = *(*(of*(o)x)o) ]]
+0: [[ ofoooxoofxo = *(*(of*(o)x)o) ]]
+0: [[ ofoooxoofxoofoooxoofxo = *(*(of*(o)x)o) ]]
+0: [[ ofoooxoofxoofoooxoofxoo = *(*(of*(o)x)o) ]]
+1: [[ ofoooxoofxoofoooxoofxofo = *(*(of*(o)x)o) ]]
+0: [[ ofoooxoofxoofoooxoofxooofxofxo = *(*(of*(o)x)o) ]]
+0: [[ aac = *(@(a))a@(c) ]]
+0: [[ ac = *(@(a))a@(c) ]]
+1: [[ c = *(@(a))a@(c) ]]
+0: [[ aaac = *(@(a))a@(c) ]]
+1: [[ baaac = *(@(a))a@(c) ]]
+0: [[ abcd = ?@(a|b)*@(c)d ]]
+0: [[ abcd = @(ab|a*@(b))*(c)d ]]
+0: [[ acd = @(ab|a*(b))*(c)d ]]
+0: [[ abbcd = @(ab|a*(b))*(c)d ]]
+0: [[ effgz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
+0: [[ efgz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
+0: [[ egz = @(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
+0: [[ egzefffgzbcdij = *(b+(c)d|e*(f)g?|?(h)i@(j|k)) ]]
+1: [[ egz = @(b+(c)d|e+(f)g?|?(h)i@(j|k)) ]]
+0: [[ ofoofo = *(of+(o)) ]]
+0: [[ oxfoxoxfox = *(oxf+(ox)) ]]
+1: [[ oxfoxfox = *(oxf+(ox)) ]]
+0: [[ ofoofo = *(of+(o)|f) ]]
+0: [[ foofoofo = @(foo|f|fo)*(f|of+(o)) ]]
+0: [[ oofooofo = *(of|oof+(o)) ]]
+0: [[ fffooofoooooffoofffooofff = *(*(f)*(o)) ]]
+0: [[ fofoofoofofoo = *(fo|foo) ]]
+0: [[ foo = !(x) ]]
+0: [[ foo = !(x)* ]]
+1: [[ foo = !(foo) ]]
+0: [[ foo = !(foo)* ]]
+0: [[ foobar = !(foo) ]]
+0: [[ foobar = !(foo)* ]]
+0: [[ moo.cow = !(*.*).!(*.*) ]]
+1: [[ mad.moo.cow = !(*.*).!(*.*) ]]
+1: [[ mucca.pazza = mu!(*(c))?.pa!(*(z))? ]]
+0: [[ fff = !(f) ]]
+0: [[ fff = *(!(f)) ]]
+0: [[ fff = +(!(f)) ]]
+0: [[ ooo = !(f) ]]
+0: [[ ooo = *(!(f)) ]]
+0: [[ ooo = +(!(f)) ]]
+0: [[ foo = !(f) ]]
+0: [[ foo = *(!(f)) ]]
+0: [[ foo = +(!(f)) ]]
+1: [[ f = !(f) ]]
+1: [[ f = *(!(f)) ]]
+1: [[ f = +(!(f)) ]]
+0: [[ foot = @(!(z*)|*x) ]]
+1: [[ zoot = @(!(z*)|*x) ]]
+0: [[ foox = @(!(z*)|*x) ]]
+0: [[ zoox = @(!(z*)|*x) ]]
+0: [[ foo = *(!(foo)) ]]
+1: [[ foob = !(foo)b* ]]
+0: [[ foobb = !(foo)b* ]]
+0 tests failed.
diff --git a/tests/extglob2.tests b/tests/extglob2.tests
new file mode 100755
index 00000000..f35c3e8b
--- /dev/null
+++ b/tests/extglob2.tests
@@ -0,0 +1,90 @@
+#
+# More ksh-like extended globbing tests, cribbed from zsh-3.1.5
+#
+shopt -s extglob
+
+failed=0
+while read res str pat; do
+ [[ $res = '#' ]] && continue
+ [[ $str = ${pat} ]]
+ ts=$?
+ [[ $1 = -q ]] || echo "$ts: [[ $str = $pat ]]"
+ if [[ ( $ts -gt 0 && $res = t) || ($ts -eq 0 && $res = f) ]]; then
+ echo "Test failed: [[ $str = $pat ]]"
+ (( failed += 1 ))
+ fi
+done <<EOT
+t fofo *(f*(o))
+t ffo *(f*(o))
+t foooofo *(f*(o))
+t foooofof *(f*(o))
+t fooofoofofooo *(f*(o))
+f foooofof *(f+(o))
+f xfoooofof *(f*(o))
+f foooofofx *(f*(o))
+t ofxoofxo *(*(of*(o)x)o)
+f ofooofoofofooo *(f*(o))
+t foooxfooxfoxfooox *(f*(o)x)
+f foooxfooxofoxfooox *(f*(o)x)
+t foooxfooxfxfooox *(f*(o)x)
+t ofxoofxo *(*(of*(o)x)o)
+t ofoooxoofxo *(*(of*(o)x)o)
+t ofoooxoofxoofoooxoofxo *(*(of*(o)x)o)
+t ofoooxoofxoofoooxoofxoo *(*(of*(o)x)o)
+f ofoooxoofxoofoooxoofxofo *(*(of*(o)x)o)
+t ofoooxoofxoofoooxoofxooofxofxo *(*(of*(o)x)o)
+t aac *(@(a))a@(c)
+t ac *(@(a))a@(c)
+f c *(@(a))a@(c)
+t aaac *(@(a))a@(c)
+f baaac *(@(a))a@(c)
+t abcd ?@(a|b)*@(c)d
+t abcd @(ab|a*@(b))*(c)d
+t acd @(ab|a*(b))*(c)d
+t abbcd @(ab|a*(b))*(c)d
+t effgz @(b+(c)d|e*(f)g?|?(h)i@(j|k))
+t efgz @(b+(c)d|e*(f)g?|?(h)i@(j|k))
+t egz @(b+(c)d|e*(f)g?|?(h)i@(j|k))
+t egzefffgzbcdij *(b+(c)d|e*(f)g?|?(h)i@(j|k))
+f egz @(b+(c)d|e+(f)g?|?(h)i@(j|k))
+t ofoofo *(of+(o))
+t oxfoxoxfox *(oxf+(ox))
+f oxfoxfox *(oxf+(ox))
+t ofoofo *(of+(o)|f)
+# The following is supposed to match only as fo+ofo+ofo
+t foofoofo @(foo|f|fo)*(f|of+(o))
+t oofooofo *(of|oof+(o))
+t fffooofoooooffoofffooofff *(*(f)*(o))
+# The following tests backtracking in alternation matches
+t fofoofoofofoo *(fo|foo)
+# Exclusion
+t foo !(x)
+t foo !(x)*
+f foo !(foo)
+t foo !(foo)*
+t foobar !(foo)
+t foobar !(foo)*
+t moo.cow !(*.*).!(*.*)
+f mad.moo.cow !(*.*).!(*.*)
+f mucca.pazza mu!(*(c))?.pa!(*(z))?
+t fff !(f)
+t fff *(!(f))
+t fff +(!(f))
+t ooo !(f)
+t ooo *(!(f))
+t ooo +(!(f))
+t foo !(f)
+t foo *(!(f))
+t foo +(!(f))
+f f !(f)
+f f *(!(f))
+f f +(!(f))
+t foot @(!(z*)|*x)
+f zoot @(!(z*)|*x)
+t foox @(!(z*)|*x)
+t zoox @(!(z*)|*x)
+t foo *(!(foo))
+f foob !(foo)b*
+t foobb !(foo)b*
+EOT
+echo "$failed tests failed."
diff --git a/tests/func.right b/tests/func.right
index fcdfe92d..39803951 100644
--- a/tests/func.right
+++ b/tests/func.right
@@ -26,3 +26,95 @@ f1 ()
echo $status;
return $status
}
+before: try to assign to FUNCNAME
+outside: FUNCNAME =
+before: FUNCNAME = func
+FUNCNAME = func2
+after: FUNCNAME = func
+outside2: FUNCNAME =
+function
+zf is a function
+zf ()
+{
+ echo this is zf
+}
+f is a function
+f ()
+{
+ echo f-x;
+ echo f-y
+} 1>&2
+subshell
+f is a function
+f ()
+{
+ echo f-x;
+ echo f-y
+} 1>&2
+f2 is a function
+f2 ()
+{
+ echo f2-a;
+ function f3 ()
+ {
+ echo f3-a;
+ echo f3-b
+ } 1>&2;
+ f3
+}
+subshell
+f2 is a function
+f2 ()
+{
+ echo f2-a;
+ function f3 ()
+ {
+ echo f3-a;
+ echo f3-b
+ } 1>&2;
+ f3
+}
+f4 is a function
+f4 ()
+{
+ echo f4-a;
+ function f5 ()
+ {
+ echo f5-a;
+ echo f5-b
+ } 1>&2;
+ f5
+} 2>&1
+subshell
+f4 is a function
+f4 ()
+{
+ echo f4-a;
+ function f5 ()
+ {
+ echo f5-a;
+ echo f5-b
+ } 1>&2;
+ f5
+} 2>&1
+testgrp is a function
+testgrp ()
+{
+ echo testgrp-a;
+ {
+ echo tg-x;
+ echo tg-y
+ } 1>&2;
+ echo testgrp-b
+}
+subshell
+testgrp is a function
+testgrp ()
+{
+ echo testgrp-a;
+ {
+ echo tg-x;
+ echo tg-y
+ } 1>&2;
+ echo testgrp-b
+}
diff --git a/tests/func.tests b/tests/func.tests
index 8abf4ce0..ed3d355c 100644
--- a/tests/func.tests
+++ b/tests/func.tests
@@ -117,3 +117,37 @@ declare -f f1 # should print the definition, too
# no functions should be exported, right?
declare -xF
declare -xf
+
+# FUNCNAME tests
+func2()
+{
+ echo FUNCNAME = $FUNCNAME
+}
+
+func()
+{
+ echo before: FUNCNAME = $FUNCNAME
+ func2
+ echo after: FUNCNAME = $FUNCNAME
+}
+
+echo before: try to assign to FUNCNAME
+FUCNAME=7
+
+echo outside: FUNCNAME = $FUNCNAME
+func
+echo outside2: FUNCNAME = $FUNCNAME
+
+# test exported functions (and cached exportstr)
+zf()
+{
+ echo this is zf
+}
+export -f zf
+
+${THIS_SH} -c 'type -t zf'
+${THIS_SH} -c 'type zf'
+
+${THIS_SH} ./func1.sub
+
+exit 0
diff --git a/tests/func1.sub b/tests/func1.sub
new file mode 100644
index 00000000..345645fd
--- /dev/null
+++ b/tests/func1.sub
@@ -0,0 +1,55 @@
+#
+# Test that redirections attached to shell functions are printed correctly.
+# This was a bug in all bash versions before bash-2.04.
+#
+f()
+{
+ echo f-x
+ echo f-y
+} >&2
+
+type f
+export -f f
+${THIS_SH} -c 'echo subshell; type f'
+
+f2()
+{
+ echo f2-a
+ f3()
+ {
+ echo f3-a
+ echo f3-b
+ } >&2
+ f3
+}
+
+type f2
+
+export -f f2
+${THIS_SH} -c 'echo subshell; type f2'
+
+f4()
+{
+ echo f4-a
+ f5()
+ {
+ echo f5-a
+ echo f5-b
+ } >&2
+ f5
+} 2>&1
+
+type f4
+export -f f4
+${THIS_SH} -c 'echo subshell; type f4'
+
+testgrp()
+{
+ echo testgrp-a
+ { echo tg-x; echo tg-y; } >&2
+ echo testgrp-b
+}
+type testgrp
+
+export -f testgrp
+${THIS_SH} -c 'echo subshell; type testgrp'
diff --git a/tests/history.right b/tests/history.right
index 7110223f..deb6b862 100644
--- a/tests/history.right
+++ b/tests/history.right
@@ -1,5 +1,5 @@
./history.tests: history: illegal option: -x
-history: usage: history [-c] [n] or history -awrn [filename] or history -ps arg [arg...]
+history: usage: history [-c] [-d offset] [n] or history -awrn [filename] or history -ps arg [arg...]
./history.tests: history: cannot use more than one of -anrw
./history.tests: fc: illegal option: -v
fc: usage: fc [-e ename] [-nlr] [first] [last] or fc -s [pat=rep] [cmd]
diff --git a/tests/invert.right b/tests/invert.right
new file mode 100644
index 00000000..5a9239aa
--- /dev/null
+++ b/tests/invert.right
@@ -0,0 +1,10 @@
+1
+1
+1
+0
+0
+1
+0
+1
+0
+1
diff --git a/tests/invert.tests b/tests/invert.tests
new file mode 100644
index 00000000..8393d95a
--- /dev/null
+++ b/tests/invert.tests
@@ -0,0 +1,19 @@
+# tests of return value inversion
+# placeholder for future expansion
+
+# user subshells (...) did this wrong in bash versions before 2.04
+
+! ( echo hello | grep h >/dev/null 2>&1 ); echo $?
+! echo hello | grep h >/dev/null 2>&1 ; echo $?
+
+! true ; echo $?
+! false; echo $?
+
+! (false) ; echo $?
+! (true); echo $?
+
+! true | false ; echo $?
+! false | true ; echo $?
+
+! (true | false) ; echo $?
+! (false | true) ; echo $?
diff --git a/tests/jobs.right b/tests/jobs.right
index 830c3973..9a10c35c 100644
--- a/tests/jobs.right
+++ b/tests/jobs.right
@@ -1,5 +1,21 @@
./jobs2.sub: fg: job %1 started without job control
fg: 1
+Waiting for job 0
+job 0 returns 0
+Waiting for job 1
+job 1 returns 0
+Waiting for job 2
+job 2 returns 0
+Waiting for job 3
+job 3 returns 0
+Waiting for job 4
+job 4 returns 0
+Waiting for job 5
+job 5 returns 0
+Waiting for job 6
+job 6 returns 0
+Waiting for job 7
+job 7 returns 0
0
./jobs.tests: wait: job control not enabled
./jobs.tests: fg: no job control
diff --git a/tests/jobs.tests b/tests/jobs.tests
index 26adfe09..d54c1e94 100644
--- a/tests/jobs.tests
+++ b/tests/jobs.tests
@@ -4,6 +4,10 @@ ${THIS_SH} ./jobs1.sub
# test out fg/bg failure in a subshell
${THIS_SH} ./jobs2.sub
+# test out behavior of waiting for background pids -- bug in versions
+# before 2.03
+${THIS_SH} ./jobs3.sub
+
jobs
echo $?
diff --git a/tests/jobs3.sub b/tests/jobs3.sub
new file mode 100644
index 00000000..6efd58b0
--- /dev/null
+++ b/tests/jobs3.sub
@@ -0,0 +1,26 @@
+#! /bin/bash
+NJOB=8
+i=0
+
+while [ $i -lt $NJOB ]
+do
+ /bin/sh -c "sleep 4; exit 0" &
+ rv=$?
+ pid=$!
+ eval bg_pid_$i=$pid
+# echo $$: Job $i: pid is $pid rv=$rv
+ i=$((i + 1))
+done
+
+
+
+i=0
+while [ $i -lt $NJOB ]
+do
+ eval wpid=\$bg_pid_$i
+ echo Waiting for job $i #'('pid $wpid')'
+ wait $wpid
+ rv=$?
+ echo job $i returns $rv
+ i=$((i + 1))
+done
diff --git a/tests/misc/dev-tcp.tests b/tests/misc/dev-tcp.tests
new file mode 100644
index 00000000..0f3a2281
--- /dev/null
+++ b/tests/misc/dev-tcp.tests
@@ -0,0 +1,16 @@
+exec 9<>/dev/tcp/129.22.8.162/25
+
+read banner <&9
+echo "$banner"
+
+echo quit >&9
+
+read msg <&9
+echo "$msg"
+
+exec 9<&-
+
+# nifty date command that queries the date/time server
+cat < /dev/tcp/129.22.8.102/13
+
+exit 0
diff --git a/tests/misc/read-nchars.tests b/tests/misc/read-nchars.tests
new file mode 100644
index 00000000..40b1f982
--- /dev/null
+++ b/tests/misc/read-nchars.tests
@@ -0,0 +1,11 @@
+# interactive
+
+# from tty
+read -n 3 -p 'enter three chars: ' xyz
+echo
+echo $xyz
+
+# using readline
+read -p 'enter 3 chars: ' -e -n 3 abc
+# readline outputs a newline for us, so we don't need the extra echo
+echo $abc
diff --git a/tests/misc/wait-bg.tests b/tests/misc/wait-bg.tests
new file mode 100644
index 00000000..95c98b08
--- /dev/null
+++ b/tests/misc/wait-bg.tests
@@ -0,0 +1,25 @@
+#! /bin/bash
+
+i=0
+while [ $i -lt $1 ]
+do
+ /bin/sh -c "sleep 4; exit 0" &
+ rv=$?
+ pid=$!
+ eval bg_pid_$i=$pid
+ echo $$: Job $i: pid is $pid rv=$rv
+ i=$((i + 1))
+done
+
+
+
+i=0
+while [ $i -lt $1 ]
+do
+ eval wpid=\$bg_pid_$i
+ echo Waiting for job $i '('pid $wpid')'
+ wait $wpid
+ rv=$?
+ echo Return value is $rv
+ i=$((i + 1))
+done
diff --git a/tests/more-exp.right b/tests/more-exp.right
index e57ce2ad..c7e1af57 100644
--- a/tests/more-exp.right
+++ b/tests/more-exp.right
@@ -202,3 +202,7 @@ argv[3] = <}>
argv[1] = <hi>
argv[2] = <K>
argv[3] = <}>
+argv[1] = <xxx>
+argv[2] = <yyy>
+1
+argv[1] = <>
diff --git a/tests/more-exp.tests b/tests/more-exp.tests
index d3f4b6f2..a562ae8d 100644
--- a/tests/more-exp.tests
+++ b/tests/more-exp.tests
@@ -453,6 +453,10 @@ recho + "$@"
expect '<+>'
recho +"$@"
+# variants of nested curly braces inside ${...} expressions
+
+# IFS is not the standard one
+
expect '<G { I>' '<K>' '<}>'
recho ${gik:-G { I } K }
@@ -460,3 +464,21 @@ abc=hi
expect '<hi>' '<K>' '<}>'
recho ${abc:-G { I } K }
+
+# reset IFS to the default
+IFS='
+'
+
+# nested ${...} inside ${...} are handled specially
+unset XXX FOO BAR
+expect '<xxx>' '<yyy>'
+XXX=xxx
+FOO=${BAR:-${XXX} yyy}
+recho $FOO
+
+# this was a bug in versions of bash prior to bash-2.04-release
+set -- ''
+expect 1
+echo $#
+expect '<>'
+recho "${@:-}"
diff --git a/tests/new-exp.right b/tests/new-exp.right
index 7f013dec..c2dc10bf 100644
--- a/tests/new-exp.right
+++ b/tests/new-exp.right
@@ -148,6 +148,12 @@ argv[4] = <mnop>
argv[5] = <qrst>
argv[6] = <uvwyyy>
+This
+string
+has
+multiple
+lines.
+This-string-has-multiple-lines.
this is a test of proc subst
this is test 2
./new-exp2.sub: /tmp/bashtmp.x*: No such file or directory
@@ -228,6 +234,10 @@ argv[1] = <e*docrine>
argv[1] = <e*docri*e>
argv[1] = <endocrine>
argv[1] = <endocrine>
+argv[1] = <endocrine>
+argv[1] = <endocrine>
+argv[1] = <endocrine>
+argv[1] = <endocrine>
argv[1] = </usr/bin>
argv[2] = </bin>
argv[3] = </usr/local/bin>
@@ -390,4 +400,38 @@ argv[1] = <5>
argv[1] = <#>
argv[1] = <#>
argv[1] = <>
+argv[1] = <_QUANTITY>
+argv[2] = <_QUART>
+argv[3] = <_QUEST>
+argv[4] = <_QUILL>
+argv[5] = <_QUOTA>
+argv[6] = <_QUOTE>
+argv[1] = <_QUANTITY>
+argv[2] = <_QUART>
+argv[3] = <_QUEST>
+argv[4] = <_QUILL>
+argv[5] = <_QUOTA>
+argv[6] = <_QUOTE>
+argv[1] = <_QUANTITY-_QUART-_QUEST-_QUILL-_QUOTA-_QUOTE>
+./new-exp3.sub: ${!_Q* }: bad substitution
+./new-exp3.sub: ${!1*}: bad substitution
+./new-exp3.sub: ${!@*}: bad substitution
+./new-exp.tests: ${$(($#-1))}: bad substitution
+argv[1] = <a>
+argv[2] = <b>
+argv[3] = <c>
+argv[4] = <d>
+argv[5] = <e>
+argv[6] = <f>
+argv[7] = <g>
+argv[1] = <a>
+argv[2] = <b>
+argv[3] = <c>
+argv[4] = <d>
+argv[5] = <e>
+argv[1] = <a>
+argv[1] = <a>
+argv[2] = <b>
+argv[1] = <>
+./new-exp.tests: $(($# - 2)): substring expression < 0
./new-exp.tests: ABXD: parameter unset
diff --git a/tests/new-exp.tests b/tests/new-exp.tests
index f2d50d83..683fa46a 100644
--- a/tests/new-exp.tests
+++ b/tests/new-exp.tests
@@ -227,6 +227,15 @@ recho ${@//%x*/yyy}
expect a newline
echo $abmcde
+# sneaky way to replace a newline in a variable value with something else
+AVAR=$'This\nstring\nhas\nmultiple\nlines.'
+echo "${AVAR}"
+
+eval BVAR=\"\${AVAR//$'\n'/-}\"
+echo "$BVAR"
+
+unset AVAR BVAR
+
# run process substitution tests in a subshell so that syntax errors
# caused by a shell not implementing process substitution (e.g., one
# built on a NeXT) will not cause the whole test to exit prematurely
@@ -402,6 +411,11 @@ recho ${xxx//$yyy/*}
recho ${xxx/$zzz/*}
recho ${xxx//$zzz/*}
+recho ${xxx//%${zzz}/}
+recho ${xxx//%${zzz}}
+recho ${xxx//#${zzz}/}
+recho ${xxx//#${zzz}}
+
# another case that caused a core dump in bash-2.0
XPATH=/usr/bin:/bin:/usr/local/bin:/usr/gnu/bin::/usr/bin/X11:/sbin:/usr/sbin
@@ -455,6 +469,32 @@ recho "${RECEIVED:$((${#RECEIVED}-1)):1}"
RECEIVED=""
recho "${RECEIVED:$((${#RECEIVED}-1)):1}"
+# tests of new prefix expansion ${!prefix*}
+${THIS_SH} ./new-exp3.sub
+
+# these caused errors and core dumps in versions before bash-2.04
+c=""
+echo ${c//${$(($#-1))}/x/}
+
+set a b c d e f g
+recho "$@"
+
+set -- ${@:1:$(($# - 2))}
+recho "$@"
+
+set a b
+recho ${@:1:$(($# - 2))}
+
+recho ${@:1:0}
+recho ${@:1:1}
+recho ${@:1:2}
+
+recho "${*:1:0}"
+
+# this is an error -- negative expression
+set a
+recho ${@:1:$(($# - 2))}
+
# this must be last!
expect $0: 'ABXD: parameter unset'
recho ${ABXD:?"parameter unset"}
diff --git a/tests/new-exp3.sub b/tests/new-exp3.sub
new file mode 100644
index 00000000..3107ef14
--- /dev/null
+++ b/tests/new-exp3.sub
@@ -0,0 +1,26 @@
+:
+# Set up some dummy variables beginning with _Q
+_QUANTITY=
+_QUOTA=
+_QUOTE=
+_QUILL=
+_QUEST=
+_QUART=
+
+recho ${!_Q*}
+
+IFS="-$IFS"
+
+recho ${!_Q*}
+recho "${!_Q*}"
+
+recho ${!_Y*}
+
+recho "${!_Q* }"
+
+IFS=$' \t\n'
+
+set a b c d e f g h i j k l m n o p
+recho ${!1*}
+
+recho ${!@*}
diff --git a/tests/nquote.right b/tests/nquote.right
index 9651f311..35bf1919 100644
--- a/tests/nquote.right
+++ b/tests/nquote.right
@@ -1,4 +1,5 @@
argv[1] = <^J^J^J>
+argv[1] = <++^J++>
argv[1] = <>
argv[1] = <^J^I >
argv[1] = <abc>
@@ -15,3 +16,7 @@ argv[1] = <hello, $"world">
argv[1] = <$hello, chet>
argv[1] = <hello, chet>
ok
+'abcd'
+'abcd'
+\'abcd\'
+\'abcd\'
diff --git a/tests/nquote.tests b/tests/nquote.tests
index 6ce89079..05709f45 100644
--- a/tests/nquote.tests
+++ b/tests/nquote.tests
@@ -6,6 +6,11 @@ expect()
expect '<^J^J^J>'
recho $'\n\n\n'
+expect '<++^J++>'
+f=$'\n'
+recho "++$f++"
+unset f
+
z1=$''
expect '<>'
recho "$z1"
@@ -61,3 +66,15 @@ case "$z" in
$'\v\f\a\b') echo ok;;
*) echo bad;;
esac
+
+# Dave Korn says this should be allowed and echo 'abcd'
+echo $'\'abcd\''
+
+# printf translates \' to ' ...
+printf "\'abcd\'\n"
+
+# but echo -e doesn't
+echo -e "\'abcd\'"
+echo -e "\\'abcd\\'"
+
+
diff --git a/tests/printf.right b/tests/printf.right
index ac1bce45..53b79b08 100644
--- a/tests/printf.right
+++ b/tests/printf.right
Binary files differ
diff --git a/tests/printf.tests b/tests/printf.tests
index 9b47d9e8..5654ea48 100644
--- a/tests/printf.tests
+++ b/tests/printf.tests
@@ -1,4 +1,5 @@
LC_ALL=C
+LC_NUMERIC=C
# these should output error messages -- the format is required
printf
@@ -22,6 +23,11 @@ printf "no newline " ; printf "now newline\n"
# %% -> %
printf "%%\n"
+# this was a bug caused by pre-processing the string for backslash escapes
+# before doing the `%' format processing -- all versions before bash-2.04
+printf "\045" ; echo
+printf "\045d\n"
+
# simple character output
printf "%c\n" ABCD
@@ -83,6 +89,12 @@ printf -- "--%b--\n"
# of the format string
printf -- "--%b--\n" '4.2\c5.4\n'; printf "\n"
+# unrecognized escape sequences should by displayed unchanged
+printf -- "--%b--\n" '4\.2'
+
+# a bare \ should not be processed as an escape sequence
+printf -- "--%b--\n" '\'
+
# make sure extra arguments are ignored if the format string doesn't
# actually use them
printf "\n" 4.4 BSD
@@ -158,6 +170,23 @@ printf -- "--%6.4b--\n" abcdefghijklmnopqrstuvwxyz
printf -- "--%12.10s--\n" abcdefghijklmnopqrstuvwxyz
printf -- "--%12.10b--\n" abcdefghijklmnopqrstuvwxyz
+# tests for translating \' to ' and \\ to \
+# printf translates \' to ' in the format string...
+printf "\'abcd\'\n"
+
+# but not when the %b format specification is used
+printf "%b\n" \\\'abcd\\\'
+
+# but both translate \\ to \
+printf '\\abcd\\\n'
+printf "%b\n" '\\abcd\\'
+
+# this was reported as a bug in bash-2.03
+# these three lines should all echo `26'
+printf "%d\n" 0x1a
+printf "%d\n" 032
+printf "%d\n" 26
+
# error messages
# this should be an overflow, but error messages vary between systems
diff --git a/tests/read.right b/tests/read.right
index 32ce2630..b9eeffba 100644
--- a/tests/read.right
+++ b/tests/read.right
@@ -29,3 +29,19 @@ argv[1] = < foo>
argv[1] = <foo>
argv[1] = <foo>
argv[1] = < foo>
+a = abcdefg
+a = xyz
+a = -xyz 123-
+a = abc
+1
+4
+1
+4
+./read2.sub: read: -3: invalid timeout specification
+1
+4
+abcde
+./read3.sub: read: -1: invalid number specification
+abc
+ab
+#
diff --git a/tests/read.tests b/tests/read.tests
index 83ef028a..f974324c 100644
--- a/tests/read.tests
+++ b/tests/read.tests
@@ -78,3 +78,12 @@ echo " foo" | { IFS=$' \n' ; read line; recho "$line"; }
echo " foo" | { IFS=$' \t\n' ; read line; recho "$line"; }
echo " foo" | { IFS=$':' ; read line; recho "$line"; }
+
+# test read -d delim behavior
+${THIS_SH} ./read1.sub
+
+# test read -t timeout behavior
+${THIS_SH} ./read2.sub
+
+# test read -n nchars behavior
+${THIS_SH} ./read3.sub
diff --git a/tests/read1.sub b/tests/read1.sub
new file mode 100644
index 00000000..2a36449b
--- /dev/null
+++ b/tests/read1.sub
@@ -0,0 +1,23 @@
+a=7
+echo 'abcdefg|xyz' | {
+ read -d '|' a
+ echo a = "${a-unset}"
+}
+
+echo xyz 123 | {
+ read -d ' ' a
+ echo a = "${a-unset}"
+}
+
+echo xyz 123 | {
+ read -d $'\n' a
+ echo a = -"${a-unset}"-
+}
+
+a=44
+echo abcd | {
+ read -d d a
+ echo a = $a
+}
+
+exit 0
diff --git a/tests/read2.sub b/tests/read2.sub
new file mode 100644
index 00000000..1e632c35
--- /dev/null
+++ b/tests/read2.sub
@@ -0,0 +1,22 @@
+a=4
+
+read -t 2 a
+echo $?
+
+echo $a
+
+sleep 5 | read -t 1 a
+echo $?
+
+echo $a
+
+read -t -3 a
+echo $?
+
+echo $a
+
+# the above should all time out
+echo abcde | {
+ read -t 2 a
+ echo $a
+}
diff --git a/tests/read3.sub b/tests/read3.sub
new file mode 100644
index 00000000..22088cbf
--- /dev/null
+++ b/tests/read3.sub
@@ -0,0 +1,19 @@
+# non-interactive
+
+# error
+read -n -1
+
+# from pipe -- should work, but doesn't change tty attributes
+echo abcdefg | {
+ read -n 3 xyz
+ echo $xyz
+}
+
+# fewer chars than specified
+echo ab | {
+ read -n 3 xyz
+ echo $xyz
+}
+
+read -n 1 < $0
+echo "$REPLY"
diff --git a/tests/redir.tests b/tests/redir.tests
index 4e58754d..3e6e8766 100644
--- a/tests/redir.tests
+++ b/tests/redir.tests
@@ -140,6 +140,11 @@ cd
EOF
echo $l2
+# These should not echo anything -- bug in versions before 2.04
+( ( echo hello 1>&3 ) 3>&1 ) >/dev/null 2>&1
+
+( ( echo hello 1>&3 ) 3>&1 ) >/dev/null 2>&1 | cat
+
# in posix mode, non-interactive shells are not allowed to perform
# filename expansion on input redirections, even if they expand to
# a single filename
diff --git a/tests/run-all b/tests/run-all
index 8a959a14..d3f3a0e9 100644
--- a/tests/run-all
+++ b/tests/run-all
@@ -13,12 +13,14 @@ export THIS_SH
${THIS_SH} ./version
+rm -f /tmp/xx
+
echo Any output from any test, unless otherwise noted, indicates a possible anomaly
for x in run-*
do
case $x in
- $0|run-minimal) ;;
+ $0|run-minimal|run-gprof) ;;
*.orig|*~) ;;
*) echo $x ; sh $x ;;
esac
diff --git a/tests/run-arith-for b/tests/run-arith-for
new file mode 100644
index 00000000..1d130752
--- /dev/null
+++ b/tests/run-arith-for
@@ -0,0 +1,2 @@
+${THIS_SH} ./arith-for.tests > /tmp/xx 2>&1
+diff /tmp/xx arith-for.right && rm -f /tmp/xx
diff --git a/tests/run-extglob2 b/tests/run-extglob2
new file mode 100644
index 00000000..0a6f728e
--- /dev/null
+++ b/tests/run-extglob2
@@ -0,0 +1,4 @@
+PATH=$PATH:`pwd`
+export PATH
+${THIS_SH} ./extglob2.tests | grep -v '^expect' > /tmp/xx
+diff /tmp/xx extglob2.right && rm -f /tmp/xx
diff --git a/tests/run-invert b/tests/run-invert
new file mode 100644
index 00000000..67e08792
--- /dev/null
+++ b/tests/run-invert
@@ -0,0 +1,2 @@
+${THIS_SH} ./invert.tests | grep -v '^expect' > /tmp/xx
+diff /tmp/xx invert.right && rm -f /tmp/xx
diff --git a/tests/run-minimal b/tests/run-minimal
index 018916a2..30141810 100644
--- a/tests/run-minimal
+++ b/tests/run-minimal
@@ -16,6 +16,8 @@ export THIS_SH
${THIS_SH} ./version.mini
+rm -f /tmp/xx
+
echo Testing ${THIS_SH}
echo Any output from any test, unless otherwise noted, indicates a possible anomaly
for x in run-*
@@ -24,8 +26,8 @@ do
$0) ;;
*.orig|*~) ;;
run-dollars|run-execscript|run-func|run-getopts|run-heredoc) echo $x ; sh $x ;;
- run-ifs-tests|run-input-test|run-more-exp|run-nquote|run-posix2) echo $x ; sh $x ;;
- run-posixpat) echo $x ; sh $x ;;
+ run-ifs-tests|run-input-test|run-invert|run-more-exp|run-nquote) echo $x ; sh $x ;;
+ run-posix2|run-posixpat) echo $x ; sh $x ;;
run-precedence|run-quote|run-read|run-rhs-exp|run-strip|run-tilde) echo $x ; sh $x ;;
*) ;;
esac
diff --git a/tests/run-new-exp b/tests/run-new-exp
index 56dff720..2e3d7c9d 100644
--- a/tests/run-new-exp
+++ b/tests/run-new-exp
@@ -2,6 +2,9 @@ echo "warning: two of these tests will fail if your OS does not support" >&2
echo "warning: named pipes or the /dev/fd filesystem. If the tests of the" >&2
echo "warning: process substitution mechanism fail, please do not consider" >&2
echo "warning: this a test failure" >&2
+echo "warning: if you have exported variables beginning with the string _Q," >&2
+echo "warning: diff output may be generated. If so, please do not consider" >&2
+echo "warning: this a test failure" >&2
${THIS_SH} ./new-exp.tests 2>&1 | grep -v '^expect' > /tmp/xx
diff /tmp/xx new-exp.right && rm -f /tmp/xx
diff --git a/tests/run-read b/tests/run-read
index f2444ba8..35c94e40 100644
--- a/tests/run-read
+++ b/tests/run-read
@@ -1,2 +1,2 @@
-${THIS_SH} ./read.tests > /tmp/xx
+${THIS_SH} ./read.tests > /tmp/xx 2>&1
diff /tmp/xx read.right && rm -f /tmp/xx
diff --git a/tests/run-test b/tests/run-test
index 645693f9..32fbde7a 100644
--- a/tests/run-test
+++ b/tests/run-test
@@ -1,2 +1,2 @@
-${THIS_SH} ./test-tests >/tmp/xx 2>&1
+${THIS_SH} ./test.tests >/tmp/xx 2>&1
diff /tmp/xx test.right && rm -f /tmp/xx
diff --git a/tests/shopt.right b/tests/shopt.right
index 9dc01fbc..3eff4b5e 100644
--- a/tests/shopt.right
+++ b/tests/shopt.right
@@ -18,12 +18,15 @@ shopt -u huponexit
shopt -s interactive_comments
shopt -u lithist
shopt -u mailwarn
+shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nullglob
+shopt -s progcomp
shopt -s promptvars
shopt -u restricted_shell
shopt -u shift_verbose
shopt -s sourcepath
+shopt -u xpg_echo
--
shopt -u huponexit
shopt -u checkwinsize
@@ -34,6 +37,7 @@ shopt -s cmdhist
shopt -s expand_aliases
shopt -s hostcomplete
shopt -s interactive_comments
+shopt -s progcomp
shopt -s promptvars
shopt -s sourcepath
--
@@ -49,10 +53,12 @@ shopt -u histverify
shopt -u huponexit
shopt -u lithist
shopt -u mailwarn
+shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nullglob
shopt -u restricted_shell
shopt -u shift_verbose
+shopt -u xpg_echo
--
cdable_vars off
checkhash off
@@ -66,10 +72,12 @@ histverify off
huponexit off
lithist off
mailwarn off
+no_empty_cmd_completion off
nocaseglob off
nullglob off
restricted_shell off
shift_verbose off
+xpg_echo off
--
set +o allexport
set -o braceexpand
diff --git a/tests/shopt.tests b/tests/shopt.tests
index 00170a97..d4f2a8b1 100644
--- a/tests/shopt.tests
+++ b/tests/shopt.tests
@@ -24,6 +24,7 @@ shopt -u nullglob
shopt -s promptvars
shopt -u shift_verbose
shopt -s sourcepath
+shopt -u xpg_echo
# Now, start checking the output
builtin printf -- "--\n"
diff --git a/tests/test.right b/tests/test.right
index 8684a121..2fd46808 100644
--- a/tests/test.right
+++ b/tests/test.right
@@ -154,6 +154,12 @@ t -w /dev/fd/1
0
t -w /dev/fd/2
0
+t -r /dev/stdin
+0
+t -w /dev/stdout
+0
+t -w /dev/stderr
+0
t
1
b
@@ -221,46 +227,46 @@ t -G /tmp/test.group
t -h /tmp/test.symlink
0
t 4+3 -eq 7
-./test-tests: test: 4+3: integer expression expected
+./test.tests: test: 4+3: integer expression expected
2
b 4-5 -eq 7
-./test-tests: [: 4+3: integer expression expected
+./test.tests: [: 4+3: integer expression expected
2
t 9 -eq 4+5
-./test-tests: test: 4+5: integer expression expected
+./test.tests: test: 4+5: integer expression expected
2
b 9 -eq 4+5
-./test-tests: [: 4+5: integer expression expected
+./test.tests: [: 4+5: integer expression expected
2
t A -eq 7
-./test-tests: test: A: integer expression expected
+./test.tests: test: A: integer expression expected
2
b A -eq 7
-./test-tests: [: A: integer expression expected
+./test.tests: [: A: integer expression expected
2
t 9 -eq B
-./test-tests: test: B: integer expression expected
+./test.tests: test: B: integer expression expected
2
b 9 -eq B
-./test-tests: [: B: integer expression expected
+./test.tests: [: B: integer expression expected
2
t ( 1 = 2
-./test-tests: test: `)' expected
+./test.tests: test: `)' expected
2
b ( 1 = 2
-./test-tests: [: `)' expected, found ]
+./test.tests: [: `)' expected, found ]
2
-./test-tests: test: a: unary operator expected
+./test.tests: test: a: unary operator expected
2
-./test-tests: test: b: binary operator expected
+./test.tests: test: b: binary operator expected
2
-./test-tests: test: -A: unary operator expected
+./test.tests: test: -A: unary operator expected
2
-./test-tests: test: too many arguments
+./test.tests: test: too many arguments
2
-./test-tests: test: too many arguments
+./test.tests: test: too many arguments
2
-./test-tests: [: missing `]'
+./test.tests: [: missing `]'
2
-./test-tests: test: (: unary operator expected
+./test.tests: test: (: unary operator expected
2
diff --git a/tests/test-tests b/tests/test.tests
index d0194d26..9df5cc2c 100644
--- a/tests/test-tests
+++ b/tests/test.tests
@@ -259,6 +259,13 @@ t -w /dev/fd/1
echo 't -w /dev/fd/2'
t -w /dev/fd/2
+echo 't -r /dev/stdin'
+t -r /dev/stdin
+echo 't -w /dev/stdout'
+t -w /dev/stdout
+echo 't -w /dev/stderr'
+t -w /dev/stderr
+
echo 't'
t
echo 'b'
diff --git a/tests/varenv.right b/tests/varenv.right
index 771ee640..f5baaaef 100644
--- a/tests/varenv.right
+++ b/tests/varenv.right
@@ -33,3 +33,4 @@ braceexpand:hashall
hPB
braceexpand:hashall:physical
declare -r SHELLOPTS="braceexpand:hashall:physical"
+abcde
diff --git a/tests/varenv.sh b/tests/varenv.sh
index 8f5a7163..4f907618 100644
--- a/tests/varenv.sh
+++ b/tests/varenv.sh
@@ -125,11 +125,11 @@ export A
# Make sure expansion doesn't use assignment statements preceding a builtin
A=ZVAR echo $A
-PATH=/bin:/usr/bin:/usr/local/bin:.
+XPATH=/bin:/usr/bin:/usr/local/bin:.
func2()
{
local z=yy
- local -a avar=( ${PATH//: } )
+ local -a avar=( ${XPATH//: } )
echo ${avar[@]}
local
}
@@ -184,3 +184,13 @@ echo ${SHELLOPTS}
# and make sure it is readonly
readonly -p | grep SHELLOPTS
+
+# This was an error in bash versions prior to bash-2.04. The `set -a'
+# should cause the assignment statement that's an argument to typeset
+# to create an exported variable
+unset FOOFOO
+FOOFOO=bar
+set -a
+typeset FOOFOO=abcde
+
+printenv FOOFOO