Bash-4.2 distribution sources and documentation

This commit is contained in:
Chet Ramey
2011-11-22 19:11:26 -05:00
parent 30d188c293
commit 495aee441b
341 changed files with 108751 additions and 36060 deletions
+20
View File
@@ -0,0 +1,20 @@
shopt -s expand_aliases
alias foo=echo
< /dev/null foo bar
< /dev/null x=value
echo $x
< /dev/null x=newvalue foo bar
echo $x
# problem reported by Vincent Lefevre
alias a="echo OK >&2"
a
> /dev/null a
${THIS_SH} -c 'shopt -s expand_aliases; alias a="echo OK >&2"
a
> /dev/null a'
+18 -4
View File
@@ -191,14 +191,28 @@ ok
-7
7
7
1
1
4
5
-3
2
4
5000
5000
1
0
0
1
2147483649
8 12
./arith.tests: line 274: ((: x=9 y=41 : syntax error in expression (error token is "y=41 ")
./arith.tests: line 278: a b: syntax error in expression (error token is "b")
./arith.tests: line 279: ((: a b: syntax error in expression (error token is "b")
./arith.tests: line 279: ((: x=9 y=41 : syntax error in expression (error token is "y=41 ")
./arith.tests: line 283: a b: syntax error in expression (error token is "b")
./arith.tests: line 284: ((: a b: syntax error in expression (error token is "b")
42
42
42
42
42
42
./arith.tests: line 290: b[c]d: syntax error in expression (error token is "d")
./arith.tests: line 295: b[c]d: syntax error in expression (error token is "d")
+5
View File
@@ -262,6 +262,11 @@ echo $(( --7 ))
${THIS_SH} ./arith1.sub
${THIS_SH} ./arith2.sub
${THIS_SH} ./arith3.sub
${THIS_SH} ./arith4.sub
# make sure arithmetic expansion handles ints > 2**31 - 1 using intmax_t
echo $(( 2147483645 + 4 ))
x=4
y=7
+45
View File
@@ -0,0 +1,45 @@
RANDOM=42
(( dice[RANDOM%6+1 + RANDOM%6+1]++ ))
echo ${dice[5]}
(( ++dice[RANDOM%6+1 + RANDOM%6+1] ))
echo ${dice[6]}
v=4
DIND=20
(( dice[DIND%6 + 1]=v ))
echo ${dice[3]}
RANDOM=42
(( dice[RANDOM%6+1 + RANDOM%6+1]+=v ))
echo ${dice[5]}
(( dice[RANDOM%6+1 + RANDOM%6+1]-=v ))
echo ${dice[6]}
(( dice[RANDOM%6+1 + RANDOM%6+1]+=2 ))
echo ${dice[11]}
(( dice[RANDOM%6+1 + RANDOM%6+1]*=2 ))
echo ${dice[11]}
unset dice1 dice2
RANDOM=42
for i in {1..5000}; do ((dice1[$RANDOM%6+1 + $RANDOM%6+1]++)); done;
unset t; for i in ${dice1[@]}; do ((t+=i)); done; echo $t
foo="${dice1[@]}"
RANDOM=42
for i in {1..5000}; do ((dice2[RANDOM%6+1 + RANDOM%6+1]++)); done;
unset t; for i in ${dice2[@]}; do ((t+=i)); done; echo $t
bar="${dice2[@]}"
if [ "$foo" != "$bar" ]; then
echo "random sequences differ"
fi
+10
View File
@@ -0,0 +1,10 @@
x=$(( !!1 ))
echo $x
x=$(( -!+1 ))
echo $x
x=$(( +--+!!0 ))
echo $x
echo $(( !!+-+-~0 ))
+29
View File
@@ -312,3 +312,32 @@ argv[3] = <
argv[1] = <~>
argv[2] = <^?>
argv[3] = <€>
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
Monday
Monday
Tuesday
Monday
Monday
Tuesday
Monday
Tuesday
Wednesday
Monday
Tuesday
Wednesday
monday, monday, tuesday
wednesday, wednesday, thursday
monday, monday, tuesday
Wednesday, Wednesday, Thursday
nday
esday
dnesday
nday
esday
dnesday
onday
uesday
ednesday
onday
uesday
ednesday
+2
View File
@@ -386,3 +386,5 @@ ${THIS_SH} ./array7.sub
${THIS_SH} ./array8.sub
${THIS_SH} ./array9.sub
${THIS_SH} ./array10.sub
+52
View File
@@ -0,0 +1,52 @@
days=({Mon,Tues,Wednes,Thurs,Fri,Satur,Sun}day)
echo ${days[@]}
typeset -i count
count=0
echo ${days[${count}]}
echo ${days[$((count++))]}
echo ${days[$((count++))]}
count=0
echo ${days[count]}
echo ${days[count++]}
echo ${days[count++]}
count=0
echo ${days[$((count++))]/foo/bar}
echo ${days[$((count++))]/foo/bar}
echo ${days[$((count++))]/foo/bar}
count=0
echo ${days[count++]/foo/bar}
echo ${days[count++]/foo/bar}
echo ${days[count++]/foo/bar}
count=0
echo "${days[${count}],,}, ${days[$((count++))],,}, ${days[$((count++))],,}"
echo "${days[${count}],,}, ${days[$((count++))],,}, ${days[$((count++))],,}"
count=0
echo "${days[${count}],,}, ${days[$((count++))],,}, ${days[$((count++))],,}"
echo "${days[${count}]/foo/bar}, ${days[$((count++))]/foo/bar}, ${days[$((count++))]/foo/bar}"
count=0
echo ${days[$((count++))]:2}
echo ${days[$((count++))]:2}
echo ${days[$((count++))]:2}
count=0
echo ${days[count++]:2}
echo ${days[count++]:2}
echo ${days[count++]:2}
count=0
echo ${days[$((count++))]#?}
echo ${days[$((count++))]#?}
echo ${days[$((count++))]#?}
count=0
echo ${days[count++]#?}
echo ${days[count++]#?}
echo ${days[count++]#?}
+27
View File
@@ -0,0 +1,27 @@
declare -A myarray
# this needs fixes to skipsubscript
myarray["a]a"]="abc"
echo ${myarray["a]a"]}
myarray[$(echo ])]=def
echo ${myarray[']']}
echo ${myarray[\]]}
declare myarray["foo[bar"]=bleh
myarray["foo"]=bleh
echo "${myarray[@]}"
bar='a]=test1;#a'
myarray[$bar]=123
set | grep ^myarray=
echo ${myarray[a]}
echo "${myarray['a]=test1;#a']}"
myarray['a]=test2;#a']="def"
set | grep ^myarray=
+146
View File
@@ -0,0 +1,146 @@
declare -A foo
foo=([bar\"bie]=doll)
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo=(["bar\"bie"]="doll")
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo=(["bar\"bie"]="doll")
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo["bar\"bie"]="doll"
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo[bar\"bie]="doll"
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo=([bar\'bie]=doll)
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo=(["bar'bie"]="doll")
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo=(["bar'bie"]="doll")
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo["bar'bie"]="doll"
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo[bar\'bie]="doll"
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo=([bar\$bie]=doll)
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo=(["bar[bie"]="doll")
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo=(["bar\`bie"]="doll")
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
# this doesn't work right without the backslash
foo["bar\]bie"]="doll"
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
foo[bar\${foo}bie]="doll"
echo ${!foo[@]}
echo ${foo[@]}
declare -p foo
unset foo
declare -A foo
+1
View File
@@ -57,6 +57,7 @@ a-{bdef-g-c a-{bdef-i-c
a b c d e f g h i j k l m n o p q r s t u v w x y z
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
10 8 6 4 2 0
10 8 6 4 2 0
-50 -45 -40 -35 -30 -25 -20 -15 -10 -5 0
+3
View File
@@ -94,6 +94,9 @@ echo {a..z}
echo {a..z..2}
echo {z..a..-2}
# make sure brace expansion handles ints > 2**31 - 1 using intmax_t
echo {2147483645..2147483649}
# unwanted zero-padding -- fixed post-bash-4.0
echo {10..0..2}
echo {10..0..-2}
+4 -1
View File
@@ -138,4 +138,7 @@ a
b
./builtins.tests: line 251: exit: status: numeric argument required
before: f = 4
inside
after: f = 8 bar = 4
./builtins.tests: line 254: exit: status: numeric argument required
+3
View File
@@ -247,6 +247,9 @@ kill -l ${sigone/SIG/}
# test behavior of shopt xpg_echo
${THIS_SH} ./builtins2.sub
# test behavior of declare -g
${THIS_SH} ./builtins3.sub
# this must be last -- it is a fatal error
exit status
+14
View File
@@ -0,0 +1,14 @@
# declare -g added in bash-4.2
f=4
foo()
{
declare -g f=8
declare -g bar=4
echo inside
}
echo before: f = $f
foo
echo after: f = $f bar = $bar
+4
View File
@@ -0,0 +1,4 @@
e=$(cat <<EOF
contents
EOF)
echo $e
+9
View File
@@ -0,0 +1,9 @@
echo $(
cat <<\)
hi
))
echo $(
cat <<\EOF
hi
EOF)
+16
View File
@@ -55,3 +55,19 @@ here-doc terminated with a parenthesis
./comsub-posix1.sub: command substitution: line 2: syntax error near unexpected token `)'
./comsub-posix1.sub: command substitution: line 2: ` if x; then echo foo )'
after
swap32_posix is a function
swap32_posix ()
{
local funcname=swap32_posix;
local arg;
for arg in "$@";
do
echo $((
($arg & 4278190080) >> 24 |
($arg & 16711680) >> 8 |
($arg & 65280) << 8 |
($arg & 255) << 24
));
done
}
yes
+12
View File
@@ -198,9 +198,21 @@ eof
${THIS_SH} ./comsub-posix1.sub
${THIS_SH} ./comsub-posix2.sub
${THIS_SH} ./comsub-posix3.sub
# produced a parse error through bash-4.0-beta2
: $(echo foo)"
"
# produced a parse error through bash-4.1
unset x
x=$(
echo yes
# a comment with " ' \
)
echo $x
unset x
# fixed after bash-4.0 released
: $(case a in a) echo ;; # comment
+16
View File
@@ -0,0 +1,16 @@
# problem with bash-4.x versions before bash-4.2. required posix interp
swap32_posix()
{
local funcname=swap32_posix
local arg
for arg in "$@"; do
echo $((
($arg & 4278190080) >> 24 |
($arg & 16711680) >> 8 |
($arg & 65280) << 8 |
($arg & 255) << 24
))
done
}
type swap32_posix
+22
View File
@@ -0,0 +1,22 @@
# parsing errors before bash-4.2
a=$(/bin/cat << EOF | wc -l
a
b
c
EOF
)
a=$(cat << EOF | wc -l
a
b
c
EOF
)
a=$(/bin/cat << EOF
a
b
c
EOF
)
+48
View File
@@ -0,0 +1,48 @@
: $(echo \;)
: $(case a in a) echo ;;# comment
esac)
: $(case a in a) echo ;; # comment
esac)
: $(: \;# not a comment )
: $(: \ # not a comment)
echo $(case a in a) echo \#esac ;;
esac)
: $(case a in a) : ;#esac ;;
esac)
: $(case a in a) : ;#esac comment )
esac)
: $(case a in a) : ;
esac)
echo $(#comment )
echo a)
echo $(case a in (a) echo ok 1;; # comment
esac)
echo $(case a in (a) echo ok 2;; # comment
(b) echo moo;;
esac)
echo $(case a in (a) echo ok 3 # comment
;;
esac)
echo $(case a in a) echo ok 4;; # comment
esac)
echo $(case a in a) echo ok 5;; # comment
b) echo moo;;
esac)
echo $(case a in (a) echo ok 6 # comment
;;
esac)
+39
View File
@@ -0,0 +1,39 @@
shopt -s extdebug
callstack(){
deep=${#BASH_ARGV[*]}
echo "deep $deep"
i=0
for ff in ${BASH_ARGV[@]}
do
echo "$i $ff"
i=$(($i+1))
done
}
f3()
{
echo $FUNCNAME: calling callstack
callstack
echo FUNCNAME stack: ${FUNCNAME[@]}
caller 0
echo $FUNCNAME: returning
}
f2()
{
echo $FUNCNAME: calling f3
f3 3 z
echo $FUNCNAME: return from f3
}
f1()
{
echo $FUNCNAME: calling f2
f2 2 y
echo $FUNCNAME: return from f2
}
echo main: calling f1
f1 1 x
echo main: f1 returns
+9
View File
@@ -0,0 +1,9 @@
set -u
echo ${#@}
echo ${@:-bar}
echo $@
echo after 1
echo ${@}
echo after 2
+9
View File
@@ -0,0 +1,9 @@
set -u
echo ${#*}
echo ${*:-bar}
echo $*
echo after 1
echo ${*}
echo after 2
+16
View File
@@ -0,0 +1,16 @@
set -- a b
IFS=
echo $*
echo "$*"
a=abcd
echo "${a#$*}"
case ab in
$*) echo ok 1;;
esac
case $* in
ab) echo ok 2 ;;
esac
+3 -3
View File
@@ -15,7 +15,7 @@ unset: usage: unset [-f] [-v] [name ...]
./errors.tests: line 52: unset: `/bin/sh': not a valid identifier
./errors.tests: line 55: unset: cannot simultaneously unset a function and a variable
./errors.tests: line 58: declare: -z: invalid option
declare: usage: declare [-aAfFilrtux] [-p] [name[=value] ...]
declare: usage: declare [-aAfFgilrtux] [-p] [name[=value] ...]
./errors.tests: line 60: declare: `-z': not a valid identifier
./errors.tests: line 61: declare: `/bin/sh': not a valid identifier
./errors.tests: line 65: declare: cannot use `-f' to make functions
@@ -69,7 +69,7 @@ source: usage: source filename [arguments]
./errors.tests: line 184: .: -i: invalid option
.: usage: . filename [arguments]
./errors.tests: line 187: set: -q: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
./errors.tests: line 190: enable: sh: not a shell builtin
./errors.tests: line 190: enable: bash: not a shell builtin
./errors.tests: line 193: shopt: cannot set and unset shell options simultaneously
@@ -77,7 +77,7 @@ set: usage: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
./errors.tests: line 199: read: `/bin/sh': not a valid identifier
./errors.tests: line 202: VAR: readonly variable
./errors.tests: line 205: readonly: -x: invalid option
readonly: usage: readonly [-af] [name[=value] ...] or readonly -p
readonly: usage: readonly [-aAf] [name[=value] ...] or readonly -p
./errors.tests: line 208: eval: -i: invalid option
eval: usage: eval [arg ...]
./errors.tests: line 209: command: -i: invalid option
+10 -3
View File
@@ -10,7 +10,7 @@ after exec1.sub without args: 0
127
/bin/sh: /bin/sh: cannot execute binary file
126
./execscript: line 39: /: is a directory
./execscript: line 39: /: Is a directory
126
/: /: is a directory
126
@@ -20,8 +20,7 @@ after exec1.sub without args: 0
0
this is bashenv
./exec3.sub: line 3: /tmp/bash-notthere: No such file or directory
./exec3.sub: line 3: exec: /tmp/bash-notthere: cannot execute: No such file or directory
126
127
./execscript: line 70: notthere: No such file or directory
127
./execscript: line 73: notthere: No such file or directory
@@ -52,4 +51,12 @@ this is ohio-state
1
testb
expand_aliases on
1
1
1
1
0
0
0
0
after
+20
View File
@@ -0,0 +1,20 @@
# make sure commands before the last one in the pipeline can't change $?
false
false | echo $?
false
(false) | echo $?
false
true | echo $?
false
(true) | echo $?
true
false | echo $?
true
(false) | echo $?
true
true | echo $?
true
(true) | echo $?
+12
View File
@@ -109,6 +109,18 @@ ${THIS_SH} ./exec7.sub
${THIS_SH} -i ./exec8.sub
${THIS_SH} ./exec9.sub
true | `echo true` &
echo after
# Problem with bash at least back to version 3.0
${THIS_SH} -c 'VAR=0; VAR=1 command exec; exit ${VAR}'
# problem with bash through bash-4.1
(
exec /var/empty/nosuch
echo bad
) 2>/dev/null
[ $? = 127 ] || echo FAIL: bad exit status $? at $LINENO
+4
View File
@@ -166,3 +166,7 @@ graph
yes
a
a
val
val
val
no arg passed
+2
View File
@@ -384,3 +384,5 @@ ${THIS_SH} ./exp1.sub
${THIS_SH} ./exp2.sub
${THIS_SH} ./exp3.sub
${THIS_SH} ./exp4.sub
+7
View File
@@ -0,0 +1,7 @@
IFS=:
case A in ([[:graph:]]) echo graph;; *) echo non-graph;; esac
[[ A == [[:graph:]] ]] && echo yes || echo no
IFS="~"; read a b <<< a~q; echo $a
IFS=':'; read a b <<< a:q; echo $a
+10
View File
@@ -0,0 +1,10 @@
f=" val" e=
echo "$e"$f
echo $e$f
echo "$e""$f"
if [[ "$1"x == x ]] ; then
echo "no arg passed"
exit 1
fi
echo "$1"x | cat -v
+13
View File
@@ -153,4 +153,17 @@ expect 2 40
2 40
expect 5 20
5 20
./func4.sub: line 10: foo: maximum function nesting level exceeded (100)
1
after: f = 100
./func4.sub: line 10: foo: maximum function nesting level exceeded (100)
1
after: f = 100
7
after FUNCNEST reset: f = 201
7
after FUNCNEST unset: f = 201
./func4.sub: line 10: foo: maximum function nesting level exceeded (20)
1
after FUNCNEST assign: f = 38
5
+3
View File
@@ -157,6 +157,9 @@ ${THIS_SH} ./func2.sub
# test for some posix-specific function behavior
${THIS_SH} ./func3.sub
# FUNCNEST testing
${THIS_SH} ./func4.sub
unset -f myfunction
myfunction() {
echo "bad shell function redirection"
+39
View File
@@ -0,0 +1,39 @@
# test FUNCNEST functionality -- bash-4.2
FUNCNEST=100
foo()
{
(( f++ ))
if (( f > 200 )); then
return 7
fi
foo
}
f=0
foo
echo $?
echo after: f = $f
f=0
foo
echo $?
echo after: f = $f
f=0
FUNCNEST=0
foo
echo $?
echo after FUNCNEST reset: f = $f
f=0
unset FUNCNEST
foo
echo $?
echo after FUNCNEST unset: f = $f
FUNCNEST=20
f=$(( FUNCNEST - 2 ))
foo
echo $?
echo after FUNCNEST assign: f = $f
+388
View File
@@ -0,0 +1,388 @@
export LC_COLLATE=C
#
# test the shell globbing
#
expect()
{
echo expect "$@"
}
# First, a test that bash-2.01.1 fails
${THIS_SH} ./glob1.sub
MYDIR=$PWD # save where we are
TESTDIR=/tmp/glob-test
mkdir $TESTDIR
builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; }
rm -rf *
touch a b c d abc abd abe bb bcd ca cb dd de Beware
mkdir bdir
# see if `regular' globbing works right
expect '<a> <abc> <abd> <abe> <X*>'
recho a* X*
expect '<a> <abc> <abd> <abe>'
recho \a*
# see if null glob expansion works
shopt -s nullglob
expect '<a> <abc> <abd> <abe>'
recho a* X*
shopt -u nullglob
# see if the failglob option works
mkdir tmp
touch tmp/l1 tmp/l2 tmp/l3
builtin echo tmp/l[12] tmp/*4 tmp/*3
shopt -s failglob
builtin echo tmp/l[12] tmp/*4 tmp/*3
rm -r tmp
shopt -u failglob
# see if the code that expands directories only works
expect '<bdir/>'
recho b*/
# Test quoted and unquoted globbing characters
expect '<*>'
recho \*
expect '<a*>'
recho 'a*'
expect '<a*>'
recho a\*
expect '<c> <ca> <cb> <a*> <*q*>'
recho c* a\* *q*
expect '<**>'
recho "*"*
expect '<**>'
recho \**
expect '<\.\./*/>'
recho "\.\./*/"
expect '<s/\..*//>'
recho 's/\..*//'
# Pattern from Larry Wall's Configure that caused bash to blow up
expect '</^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/>'
recho "/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*"'$'"/\1/"
# Make sure character classes work properly
expect '<abc> <abd> <abe> <bb> <cb>'
recho [a-c]b*
expect '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>'
recho [a-y]*[^c]
expect '<abd> <abe>'
recho a*[^c]
touch a-b aXb
expect '<a-b> <aXb>'
recho a[X-]b
touch .x .y
expect '<Beware> <d> <dd> <de>'
recho [^a-c]*
# Make sure that filenames with embedded globbing characters are handled
# properly
mkdir a\*b
> a\*b/ooo
expect '<a*b/ooo>'
recho a\*b/*
expect '<a*b/ooo>'
recho a\*?/*
expect '<no match>'
cmd='echo !7'
case "$cmd" in
*\\!*) echo match ;;
*) echo no match ;;
esac
expect '<not there>'
file='r.*'
case $file in
*.\*) echo not there ;;
*) echo there ;;
esac
# examples from the Posix.2 spec (d11.2, p. 243)
expect '<abc>'
recho a[b]c
expect '<abc>'
recho a["b"]c
expect '<abc>'
recho a[\b]c
expect '<abc>'
recho a?c
expect '<match 1>'
case abc in
a"b"c) echo 'match 1' ;;
*) echo 'BAD match 1' ;;
esac
expect '<match 2>'
case abc in
a*c) echo 'match 2' ;;
*) echo 'BAD match 2' ;;
esac
expect '<ok 1>'
case abc in
"a?c") echo 'bad 1' ;;
*) echo 'ok 1' ;;
esac
expect '<ok 2>'
case abc in
a\*c) echo 'bad 2' ;;
*) echo 'ok 2' ;;
esac
expect '<ok 3>'
case abc in
a\[b]c) echo 'bad 3' ;;
*) echo 'ok 3' ;;
esac
expect '<ok 4>'
case "$nosuchvar" in
"") echo 'ok 4' ;;
*) echo 'bad 4' ;;
esac
# This is very odd, but sh and ksh seem to agree
expect '<ok 5>'
case abc in
a["\b"]c) echo 'ok 5' ;;
*) echo 'bad 5' ;;
esac
mkdir man
mkdir man/man1
touch man/man1/bash.1
expect '<man/man1/bash.1>'
recho */man*/bash.*
expect '<man/man1/bash.1>'
recho $(echo */man*/bash.*)
expect '<man/man1/bash.1>'
recho "$(echo */man*/bash.*)"
# tests with multiple `*'s
case abc in
a***c) echo ok 1;;
esac
case abc in
a*****?c) echo ok 2;;
esac
case abc in
?*****??) echo ok 3;;
esac
case abc in
*****??) echo ok 4;;
esac
case abc in
*****??c) echo ok 5;;
esac
case abc in
?*****?c) echo ok 6;;
esac
case abc in
?***?****c) echo ok 7;;
esac
case abc in
?***?****?) echo ok 8;;
esac
case abc in
?***?****) echo ok 9;;
esac
case abc in
*******c) echo ok 10;;
esac
case abc in
*******?) echo ok 11;;
esac
case abcdecdhjk in
a*cd**?**??k) echo ok 20;;
esac
case abcdecdhjk in
a**?**cd**?**??k) echo ok 21;;
esac
case abcdecdhjk in
a**?**cd**?**??k***) echo ok 22;;
esac
case abcdecdhjk in
a**?**cd**?**??***k) echo ok 23;;
esac
case abcdecdhjk in
a**?**cd**?**??***k**) echo ok 24;;
esac
case abcdecdhjk in
a****c**?**??*****) echo ok 25;;
esac
case '-' in
[-abc]) echo ok 26 ;;
esac
case '-' in
[abc-]) echo ok 27 ;;
esac
case '\' in
\\) echo ok 28 ;;
esac
case '\' in
[\\]) echo ok 29 ;;
esac
case '\' in
'\') echo ok 30 ;;
esac
case '[' in
[[]) echo ok 31 ;;
esac
# a `[' without a closing `]' is just another character to match, in the
# bash implementation
case '[' in
[) echo ok 32 ;;
esac
case '[abc' in
[*) echo 'ok 33';;
esac
# a right bracket shall lose its special meaning and represent itself in
# a bracket expression if it occurs first in the list. -- POSIX.2 2.8.3.2
case ']' in
[]]) echo ok 34 ;;
esac
case '-' in
[]-]) echo ok 35 ;;
esac
# a backslash should just escape the next character in this context
case p in
[a-\z]) echo ok 36 ;;
esac
# this was a bug in all versions up to bash-2.04-release
case "/tmp" in
[/\\]*) echo ok 37 ;;
esac
# none of these should output anything
case abc in
??**********?****?) echo bad 1;;
esac
case abc in
??**********?****c) echo bad 2;;
esac
case abc in
?************c****?****) echo bad 3;;
esac
case abc in
*c*?**) echo bad 4;;
esac
case abc in
a*****c*?**) echo bad 5;;
esac
case abc in
a********???*******) echo bad 6;;
esac
case 'a' in
[]) echo bad 7 ;;
esac
case '[' in
[abc) echo bad 8;;
esac
# let's start testing the case-insensitive globbing code
recho b*
shopt -s nocaseglob
recho b*
recho [b]*
shopt -u nocaseglob
# make sure set -f works right
set -f
recho *
set +f
# test out the GLOBIGNORE code
GLOBIGNORE='.*:*c:*e:?'
recho *
GLOBIGNORE='.*:*b:*d:?'
recho *
# see if GLOBIGNORE can substitute for `set -f'
GLOBIGNORE='.*:*'
recho *
unset GLOBIGNORE
expect '<man/man1/bash.1>'
recho */man*/bash.*
# make sure null values for GLOBIGNORE have no effect
GLOBIGNORE=
expect '<man/man1/bash.1>'
recho */man*/bash.*
# this is for the benefit of pure coverage, so it writes the pcv file
# in the right place, and for gprof
builtin cd $MYDIR
rm -rf $TESTDIR
exit 0
+155
View File
@@ -0,0 +1,155 @@
lib/glob/glob.o
lib/glob/smatch.o
lib/glob/strmatch.o
lib/readline/bind.o
lib/readline/callback.o
lib/readline/compat.o
lib/readline/complete.o
lib/readline/display.o
lib/sh/casemod.o
lib/sh/clktck.o
lib/sh/clock.o
lib/sh/eaccess.o
lib/sh/fdprintf.o
lib/sh/fmtullong.o
lib/sh/fmtulong.o
lib/sh/fmtumax.o
lib/sh/fpurge.o
lib/sh/getenv.o
lib/sh/input_avail.o
lib/sh/itos.o
lib/:
glob
readline
sh
lib/glob:
glob.o
smatch.o
strmatch.o
lib/readline:
bind.o
callback.o
compat.o
complete.o
display.o
lib/sh:
casemod.o
clktck.o
clock.o
eaccess.o
fdprintf.o
fmtullong.o
fmtulong.o
fmtumax.o
fpurge.o
getenv.o
input_avail.o
itos.o
lib/glob/glob.o
lib/glob/smatch.o
lib/glob/strmatch.o
lib/readline/bind.o
lib/readline/callback.o
lib/readline/compat.o
lib/readline/complete.o
lib/readline/display.o
lib/sh/casemod.o
lib/sh/clktck.o
lib/sh/clock.o
lib/sh/eaccess.o
lib/sh/fdprintf.o
lib/sh/fmtullong.o
lib/sh/fmtulong.o
lib/sh/fmtumax.o
lib/sh/fpurge.o
lib/sh/getenv.o
lib/sh/input_avail.o
lib/sh/itos.o
alias.o builtins/history.o builtins/jobs.o builtins/kill.o builtins/let.o builtins/mapfile.o lib/glob/glob.o lib/glob/smatch.o lib/glob/strmatch.o lib/readline/bind.o lib/readline/callback.o lib/readline/compat.o lib/readline/complete.o lib/readline/display.o lib/sh/casemod.o lib/sh/clktck.o lib/sh/clock.o lib/sh/eaccess.o lib/sh/fdprintf.o lib/sh/fmtullong.o lib/sh/fmtulong.o lib/sh/fmtumax.o lib/sh/fpurge.o lib/sh/getenv.o lib/sh/input_avail.o lib/sh/itos.o pcomplib.o print_cmd.o redir.o shell.o sig.o stringlib.o subst.o syntax.o test.o trap.o unwind_prot.o variables.o version.o xmalloc.o y.tab.o
alias.o
builtins/history.o
builtins/jobs.o
builtins/kill.o
builtins/let.o
builtins/mapfile.o
lib/glob/glob.o
lib/glob/smatch.o
lib/glob/strmatch.o
lib/readline/bind.o
lib/readline/callback.o
lib/readline/compat.o
lib/readline/complete.o
lib/readline/display.o
lib/sh/casemod.o
lib/sh/clktck.o
lib/sh/clock.o
lib/sh/eaccess.o
lib/sh/fdprintf.o
lib/sh/fmtullong.o
lib/sh/fmtulong.o
lib/sh/fmtumax.o
lib/sh/fpurge.o
lib/sh/getenv.o
lib/sh/input_avail.o
lib/sh/itos.o
pcomplib.o
print_cmd.o
redir.o
shell.o
sig.o
stringlib.o
subst.o
syntax.o
test.o
trap.o
unwind_prot.o
variables.o
version.o
xmalloc.o
y.tab.o
builtins:
history.o
jobs.o
kill.o
let.o
mapfile.o
lib:
glob
readline
sh
lib/glob:
glob.o
smatch.o
strmatch.o
lib/readline:
bind.o
callback.o
compat.o
complete.o
display.o
lib/sh:
casemod.o
clktck.o
clock.o
eaccess.o
fdprintf.o
fmtullong.o
fmtulong.o
fmtumax.o
fpurge.o
getenv.o
input_avail.o
itos.o
alias.o builtins builtins/history.o builtins/jobs.o builtins/kill.o builtins/let.o builtins/mapfile.o lib lib/glob lib/glob/glob.o lib/glob/smatch.o lib/glob/strmatch.o lib/readline lib/readline/bind.o lib/readline/callback.o lib/readline/compat.o lib/readline/complete.o lib/readline/display.o lib/sh lib/sh/casemod.o lib/sh/clktck.o lib/sh/clock.o lib/sh/eaccess.o lib/sh/fdprintf.o lib/sh/fmtullong.o lib/sh/fmtulong.o lib/sh/fmtumax.o lib/sh/fpurge.o lib/sh/getenv.o lib/sh/input_avail.o lib/sh/itos.o pcomplib.o print_cmd.o redir.o shell.o sig.o stringlib.o subst.o syntax.o test.o trap.o unwind_prot.o variables.o version.o xmalloc.o y.tab.o
bar/foo foo
bar/foo/ foo/
bar/foo/e bar/foo/f foo/a foo/b
+41
View File
@@ -0,0 +1,41 @@
: ${TMPDIR:=/var/tmp}
dir=$PWD
shopt -s globstar
export LANG=C LC_ALL=C LC_COLLATE=C
GDIR=$TMPDIR/globstar-$$
mkdir $GDIR || exit 1
cd $GDIR || exit 1
mkdir lib builtins
mkdir lib/glob lib/readline lib/sh
touch builtins/history.o builtins/jobs.o builtins/kill.o builtins/let.o builtins/mapfile.o
touch lib/glob/glob.o lib/glob/smatch.o lib/glob/strmatch.o
touch lib/readline/bind.o lib/readline/callback.o lib/readline/compat.o lib/readline/complete.o lib/readline/display.o
touch lib/sh/casemod.o lib/sh/clktck.o lib/sh/clock.o lib/sh/eaccess.o
touch lib/sh/fdprintf.o lib/sh/fmtullong.o lib/sh/fmtulong.o lib/sh/fmtumax.o
touch lib/sh/fpurge.o lib/sh/getenv.o lib/sh/input_avail.o lib/sh/itos.o
touch alias.o
touch pcomplib.o print_cmd.o redir.o shell.o sig.o stringlib.o subst.o syntax.o
touch test.o trap.o unwind_prot.o variables.o version.o xmalloc.o y.tab.o
ls lib/**
ls lib/**/*.o
echo **/*.o
ls **
echo **
cd $dir
rm -rf $GDIR
${THIS_SH} ./globstar1.sub
+21
View File
@@ -0,0 +1,21 @@
shopt -s globstar
wdir=$PWD
: ${TMPDIR:=/var/tmp}
DIR=$TMPDIR/globstar-$$
mkdir -p $DIR
cd $DIR || {
echo "$DIR: cannot cd" >&2
exit 1
}
mkdir -p foo/{a,b} bar/{c,d,foo/{e,f}} baz/{g,h}
echo **/foo*
echo **/foo*/
echo **/foo*/*
cd $wdir
rm -rf $DIR
+1 -1
View File
@@ -120,5 +120,5 @@ var2=var1
echo ${!var2}
# Bash-2.01[.1] fails this test -- it attempts history expansion after the
# history_expansion_char
# history_comment_char
echo ok 3 # !1200
+2 -2
View File
@@ -140,7 +140,7 @@ three
one
two
three
4.1
4.2
echo ${BASH_VERSION%\.*}
4.1
4.2
echo ${BASH_VERSION%\.*}
+10
View File
@@ -0,0 +1,10 @@
set -o history
HISTSIZE=256
HISTFILE=/dev/null
# these two lines should be the same
echo ${BASH_VERSION%\.*}
echo $(fc -nl -1)
echo ${BASH_VERSION%\.*}
fc -nl -1
+7 -1
View File
@@ -6,8 +6,14 @@ B
ok 1
ok 2
aéb
0000000 141 303 251 142
0000000 141 303 251 142
0000004
-абвгдежзиклмноп - 16
-абвгдежзиклмноп- 15
-абвгд- 5
1,0000
1.0000
1.0000
1.0000
1.0000
1,0000
+5 -1
View File
@@ -35,7 +35,11 @@ esac
set a b
printf '%s\n' "$*"
printf '%s' "$*" | od -b
# squeeze out blanks to avoid white space differences in od implementations
printf '%s' "$*" | od -b | ( IFS=$' \t\n' ; while read line; do echo $line; done; )
# display differences make this problematic
${THIS_SH} ./intl1.sub
# this tests both international handling in printf and temporary environments
${THIS_SH} ./intl2.sub
+11
View File
@@ -0,0 +1,11 @@
unset LC_ALL LC_NUMERIC
export LANG=de_DE.UTF-8
printf '%.4f\n' 1
LANG=C printf '%.4f\n' 1
LANG=C /usr/bin/printf '%.4f\n' 1
env LANG=C printf '%.4f\n' 1
(LANG=C; printf '%.4f\n' 1)
printf '%.4f\n' 1
+10
View File
@@ -0,0 +1,10 @@
after 1: foo = a b c
after 2: tot = 6
after: 7
last = c
1 -- 142 1
0 -- 0 1 0
1 -- 0 0 1
1 -- 0 0 1
1 -- 0 1 0
lastpipe1.sub returns 14
+58
View File
@@ -0,0 +1,58 @@
binfalse()
{
$binfalse || return 1 # normalize return value
}
if [ -x /usr/bin/true ]; then
bintrue=/usr/bin/true
elif [ -x /bin/true ]; then
bintrue=/bin/true
else
bintrue=true
fi
if [ -x /usr/bin/false ]; then
binfalse=/usr/bin/false
elif [ -x /bin/false ]; then
binfalse=/bin/false
else
binfalse=true
fi
shopt -s lastpipe
unset foo bar
echo a b c | read foo
echo after 1: foo = $foo
unset tot
declare -i tot
printf "%d\n" 1 2 3 | while read foo; do tot+=$foo; done
echo after 2: tot = $tot
unset bar
echo g h i | bar=7
echo after: $bar
unset foo last
printf "%s\n" a b c | while read foo; do last=$foo; done
echo last = $last
exit 142 | false
echo $? -- ${PIPESTATUS[@]}
true | false | $bintrue
echo $? -- ${PIPESTATUS[@]}
true | $bintrue | false
echo $? -- ${PIPESTATUS[@]}
set -o pipefail
true | $bintrue | false
echo $? -- ${PIPESTATUS[@]}
true | binfalse | true
echo $? -- ${PIPESTATUS[@]}
set +o pipefail
${THIS_SH} ./lastpipe1.sub
echo lastpipe1.sub returns $?
+5
View File
@@ -0,0 +1,5 @@
# with lastpipe set, exit at the end of a pipeline exits
# the calling shell
shopt -s lastpipe
exit 142 | exit 14
echo after: $?
+53 -27
View File
@@ -31,28 +31,49 @@ a[0] Abcdefghijklmnop
[e] abcdefghijklmnOp
[f] abcdefghijklmnoP
a
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
5
8
11
14
0 [0] Abcdefghijklmnop
1 [1] aBcdefghijklmnop
2 [2] abCdefghijklmnop
3 [3] abcDefghijklmnop
4 [4] abcdEfghijklmnop
5 [5] abcdeFghijklmnop
6 [6] abcdefGhijklmnop
7 [7] abcdefgHijklmnop
8 [8] abcdefghIjklmnop
9 [9] abcdefghiJklmnop
10 [a] abcdefghijKlmnop
11 [b] abcdefghijkLmnop
12 [c] abcdefghijklMnop
13 [d] abcdefghijklmNop
14 [e] abcdefghijklmnOp
15 [f] abcdefghijklmnoP
16 a
2 [2] abCdefghijklmnop
5 [5] abcdeFghijklmnop
8 [8] abcdefghIjklmnop
11 [b] abcdefghijkLmnop
14 [e] abcdefghijklmnOp
[0] Abcdefghijklmnop
[1] aBcdefghijklmnop
[2] abCdefghijklmnop
@@ -131,8 +152,13 @@ a
[28] aaa
[29] aaa
1 2 3 4 5
foo 0
foo 1
foo 2
foo 3
foo 4
foo 0 1
foo 1 2
foo 2 3
foo 3 4
foo 4 5
+30 -8
View File
File diff suppressed because one or more lines are too long
+5 -1
View File
@@ -417,8 +417,10 @@ recho $c
c=${var:4}
expect nothing
recho $c
expect '<./new-exp.tests: -2: substring expression < 0>'
# as of bash-4.2, negative LENGTH means offset from the end
c=${var:0:-2}
expect '<a>'
recho $c
var=abcdefghi
c=${var:3:12}
@@ -565,6 +567,8 @@ ${THIS_SH} ./new-exp6.sub
${THIS_SH} ./new-exp7.sub
${THIS_SH} ./new-exp8.sub
# problems with stray CTLNUL in bash-4.0-alpha
unset a
a=/a
+95
View File
@@ -0,0 +1,95 @@
pat1='str'
pat2='[^;]'
pat3='[[:alnum:]_]'
pat4='[[:alnum:]][[fu]b'
pat5='?tr'
pat6='?tr\'
pat7='[[:alnum:]]_'
pat8='*tr'
declare z="start"
declare NUM=1000
#----------------------------------
# create a long string with ';'
#----------------------------------
for ((i=0; i<$NUM; i++)); do
z="$z;string$i"
done
#z="$z;string;foo"
#------------------------------
# delete everything except ';'
#------------------------------
# try different patterns here
x="${z//$pat1}"
echo $x
x="${z//$pat2}"
echo $x
x="${z//$pat3}"
echo $x
x="${z//$pat4}"
echo $x
x="${z//$pat5}"
echo $x
x="${z//$pat6}"
echo $x
x="${z//$pat7}"
echo $x
x="${z//$pat8}"
echo $x
declare z="start"
declare NUM=1000
#----------------------------------
# create a long string with ';'
#----------------------------------
for ((i=0; i<$NUM; i++)); do
z="$z;string$i"
done
#z="$z;string;foo"
#------------------------------
# delete everything except ';'
#------------------------------
# try different patterns here
x="${z//[^;]}"
echo $x
x="${z/#[^;][^;]}"
echo $x
x="${z/%[^;][^;]}"
echo $x
export LANG=C LC_ALL=C LC_CTYPE=C
# try different patterns here
x="${z//$pat1}"
echo $x
x="${z//$pat2}"
echo $x
x="${z//$pat3}"
echo $x
x="${z//$pat4}"
echo $x
x="${z//$pat5}"
echo $x
x="${z//$pat6}"
echo $x
x="${z//$pat7}"
echo $x
x="${z//$pat8}"
echo $x
# try different patterns here
x="${z//[^;]}"
echo $x
x="${z/#[^;][^;]}"
echo $x
x="${z/%[^;][^;]}"
echo $x
+6
View File
@@ -0,0 +1,6 @@
set -o history
set -H
echo $'hello\' world'
echo $'hello world!'
echo $'hello\' world!'
+41
View File
@@ -0,0 +1,41 @@
a
b
a b
argv[1] = <a>
argv[2] = <b>
argv[3] = <x>
argv[4] = <a>
argv[5] = <b>
argv[1] = <a\ b>
argv[2] = <x>
argv[3] = <a\ b>
argv[1] = <foo 'bar' baz>
argv[1] = <a b c d>
argv[1] = <a b c d>
argv[1] = <foo ax{{{}b c d{} bar>
argv[2] = <}>
argv[3] = <baz>
argv[1] = <'foo'>
argv[1] = <'foo'>
argv[1] = <$a>
argv[1] = <'foo'>
argv[1] = <foo*bar>
argv[1] = <foo*bar>
argv[1] = <foo*bar'}>
argv[1] = <x'>
<.> <x> <.> <> <.> <x> <.>
<x> <.> <w> <.> <x> <.> <w> <.>
<x> <.> <w> <.> <x> <.> <w> <.>
<x> <.> <w> <.> <x> <.> <w> <.>
<.> <w> <.> <> <.> <w> <.>
<.> <w> <.> <> <.> <w> <.>
<x> <.> <x> <.> <x> <.> <x> <.>
<x> <.> <w> <.> <x> <.> <w> <.>
<x> <.> <w> <.> <x> <.> <w> <.>
<x> <.> <w> <.> <x> <.> <w> <.>
argv[1] = <'bar>
argv[1] = <foo 'bar baz>
argv[1] = <}z>
argv[1] = <''z}>
./posixexp.tests: line 77: unexpected EOF while looking for matching `}'
./posixexp.tests: line 78: syntax error: unexpected end of file
+77
View File
@@ -0,0 +1,77 @@
unset a
printf "%s\n" ${a:=a\ b}
echo "$a"
unset v
recho ${v=a\ b} x ${v=c\ d}
unset v
recho "${v=a\ b}" x "${v=c\ d}"
unset a v
recho "foo ${IFS+'bar'} baz"
recho "a ${IFS+b c} d"
recho "a ${IFS+"b c"} d"
u=x
recho "foo ${IFS+a$u{{{\}b} c ${IFS+d{}} bar" ${IFS-e{}} baz
a=foo
recho "${IFS+'$a'}"
recho "${IFS+"'$a'"}"
recho ${IFS+'$a'}
recho ${IFS+"'$a'"}
unset a u
x='foo*bar'
recho "${x##"}"}"
recho "${x##'}'}"
recho "${x##'}"
recho "${x:-'}'}"
foo="x'a'y"
recho "${foo%*'a'*}"
unset x
unset u
v=w
printf '<%s> ' ${u+x} . ${v+x} . "${u+x}" . "${v+x}" .; echo
printf '<%s> ' ${u-x} . ${v-x} . "${u-x}" . "${v-x}" .; echo
printf '<%s> ' ${u=x} . ${v=x} . "${u=x}" . "${v=x}" .; echo
printf '<%s> ' ${u?x} . ${v?x} . "${u?x}" . "${v?x}" .; echo
printf '<%s> ' ${u#x} . ${v#x} . "${u#x}" . "${v#x}" .; echo
printf '<%s> ' ${u%x} . ${v%x} . "${u%x}" . "${v%x}" .; echo
printf '<%s> ' ${u:+x} . ${v:+x} . "${u:+x}" . "${v:+x}" .; echo
printf '<%s> ' ${u:-x} . ${v:-x} . "${u:-x}" . "${v:-x}" .; echo
printf '<%s> ' ${u:=x} . ${v:=x} . "${u:=x}" . "${v:=x}" .; echo
printf '<%s> ' ${u:?x} . ${v:?x} . "${u:?x}" . "${v:?x}" .; echo
# these are invalid substitution operators
#printf '<%s> ' ${u:#x} . ${v:#x} . "${u:#x}" . "${v:#x}" .; echo
#printf '<%s> ' ${u:%x} . ${v:%x} . "${u:%x}" . "${v:%x}" .; echo
unset foo
set -o posix
recho "${IFS+'bar}"
recho "foo ${IFS+'bar} baz"
recho ${IFS+'}'z}
recho "${IFS+'}'z}"
: ${TMPDIR:=/var/tmp}
rm -f $TMPDIR/sh
cp ${THIS_SH} $TMPDIR/sh
THIS_SH=$TMPDIR/sh ${THIS_SH} ./posixexp1.sub || echo "sh posixexp1.sub: test $? failed"
${THIS_SH} ./posixexp1.sub || echo "bash posixexp1.sub: test $? failed"
THIS_SH=$TMPDIR/sh ${THIS_SH} ./posixexp2.sub || echo "sh posixexp2.sub: test $? failed"
rm -f $TMPDIR/sh
# this will be an error
foo=bar
echo "${foo:-"a}"
+30
View File
@@ -0,0 +1,30 @@
# $FreeBSD: src/tools/regression/bin/sh/expansion/set-u1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
${THIS_SH} -uc 'unset foo; echo ${foo}' 2>/dev/null && exit 1
${THIS_SH} -uc 'unset foo; echo $foo' 2>/dev/null && exit 1
${THIS_SH} -uc 'foo=; echo $foo' >/dev/null || exit 2
${THIS_SH} -uc 'foo=1; echo $foo' >/dev/null || exit 3
# -/+/= are unaffected by set -u
${THIS_SH} -uc 'unset foo; echo ${foo-}' >/dev/null || exit 4
${THIS_SH} -uc 'unset foo; echo ${foo+}' >/dev/null || exit 5
${THIS_SH} -uc 'unset foo; echo ${foo=}' >/dev/null || exit 6
# length/trimming are affected
${THIS_SH} -uc 'unset foo; echo ${#foo}' 2>/dev/null && exit 7
${THIS_SH} -uc 'foo=; echo ${#foo}' >/dev/null || exit 8
${THIS_SH} -uc 'unset foo; echo ${foo#?}' 2>/dev/null && exit 9
${THIS_SH} -uc 'foo=1; echo ${foo#?}' >/dev/null || exit 10
${THIS_SH} -uc 'unset foo; echo ${foo##?}' 2>/dev/null && exit 11
${THIS_SH} -uc 'foo=1; echo ${foo##?}' >/dev/null || exit 12
${THIS_SH} -uc 'unset foo; echo ${foo%?}' 2>/dev/null && exit 13
${THIS_SH} -uc 'foo=1; echo ${foo%?}' >/dev/null || exit 14
${THIS_SH} -uc 'unset foo; echo ${foo%%?}' 2>/dev/null && exit 15
${THIS_SH} -uc 'foo=1; echo ${foo%%?}' >/dev/null || exit 16
${THIS_SH} -uc 'echo $!' 2>/dev/null && exit 17
${THIS_SH} -uc ':& echo $!' >/dev/null || exit 18
${THIS_SH} -uc 'echo $#' >/dev/null || exit 19
${THIS_SH} -uc 'echo $1' 2>/dev/null && exit 20
${THIS_SH} -uc 'echo $1' ${THIS_SH} xnotthere >/dev/null || exit 21
${THIS_SH} -uc 'echo $2' ${THIS_SH} xnotthere 2>/dev/null && exit 22
${THIS_SH} -uc 'echo $2' ${THIS_SH} xnotthere ynotthere >/dev/null || exit 23
exit 0
+40
View File
@@ -0,0 +1,40 @@
1 }z
2 ''z}
3 foo 'bar baz
4 foo b c baz
5 foo b c baz
6 }z
7 }z
8 ""z}
9 "}"z
10 foo bar} baz
11 ''z}
12 }z
13 }z
14 }z
15 <foo abx{ {{{}b c d{} bar> <}> <baz> .
16 hi there
17 hi there
18 hi there
19 hi there
20 hi there
21 hi there
22 hi there
23 hi there
24 'value'
25 'value'
26 $key
27 'value'
28 'x ~ x''x}"x}" #
29 <foo> <abx{ {{> <{}b> <c> <d{}> <bar> <}> <baz> .
30 <foo> <b\
ar> <baz> .
32 <foo> <bar> <baz> .
33 <foo 'bar' baz> .
34 <foo bar baz> .
35 <a> <b> <x> <a> <b> .
36 <a\ b> <x> <a\ b> .
37 <a b> <x> <c d> .
38 xay / x'a'y .
39 x' / x' .
40 < b c> .
+21
View File
@@ -0,0 +1,21 @@
x=a\ b
[ "$x" = "${x?}" ] || exit 1
set -- ${x?}
{ [ "$#" = 2 ] && [ "$1" = a ] && [ "$2" = b ]; } || exit 1
unset x
(echo ${x?abcdefg}) 2>&1 | grep abcdefg >/dev/null || exit 1
${THIS_SH} -c 'unset foo; echo ${foo?}' 2>/dev/null && exit 2
${THIS_SH} -c 'foo=; echo ${foo:?}' 2>/dev/null && exit 3
${THIS_SH} -c 'foo=; echo ${foo?}' >/dev/null || exit 4
${THIS_SH} -c 'foo=1; echo ${foo:?}' >/dev/null || exit 5
${THIS_SH} -c 'echo ${!?}' 2>/dev/null && exit 6
${THIS_SH} -c ':& echo ${!?}' >/dev/null || exit 7
${THIS_SH} -c 'echo ${#?}' >/dev/null || exit 8
${THIS_SH} -c 'echo ${*?}' 2>/dev/null && exit 9
${THIS_SH} -c 'echo ${*?}' ${THIS_SH} x >/dev/null || exit 10
${THIS_SH} -c 'echo ${1?}' 2>/dev/null && exit 11
${THIS_SH} -c 'echo ${1?}' ${THIS_SH} x >/dev/null || exit 12
${THIS_SH} -c 'echo ${2?}' ${THIS_SH} x 2>/dev/null && exit 13
${THIS_SH} -c 'echo ${2?}' ${THIS_SH} x y >/dev/null || exit 14
exit 0
+47
View File
@@ -0,0 +1,47 @@
# From mksh
set -o posix
(echo 1 ${IFS+'}'z}) 2>&- || echo failed in 1
(echo 2 "${IFS+'}'z}") 2>&- || echo failed in 2
(echo 3 "foo ${IFS+'bar} baz") 2>&- || echo failed in 3
(echo -n '4 '; printf '%s\n' "foo ${IFS+"b c"} baz") 2>&- || echo failed in 4
(echo -n '5 '; printf '%s\n' "foo ${IFS+b c} baz") 2>&- || echo failed in 5
(echo 6 ${IFS+"}"z}) 2>&- || echo failed in 6
(echo 7 "${IFS+"}"z}") 2>&- || echo failed in 7
(echo 8 "${IFS+\"}\"z}") 2>&- || echo failed in 8
(echo 9 "${IFS+\"\}\"z}") 2>&- || echo failed in 9
(echo 10 foo ${IFS+'bar} baz'}) 2>&- || echo failed in 10
(echo 11 "$(echo "${IFS+'}'z}")") 2>&- || echo failed in 11
(echo 12 "$(echo ${IFS+'}'z})") 2>&- || echo failed in 12
(echo 13 ${IFS+\}z}) 2>&- || echo failed in 13
(echo 14 "${IFS+\}z}") 2>&- || echo failed in 14
u=x; (echo -n '15 '; printf '<%s> ' "foo ${IFS+a"b$u{ {"{{\}b} c ${IFS+d{}} bar" ${IFS-e{}} baz; echo .) 2>&- || echo failed in 15
l=t; (echo 16 ${IFS+h`echo -n i ${IFS+$l}h`ere}) 2>&- || echo failed in 16
l=t; (echo 17 ${IFS+h$(echo -n i ${IFS+$l}h)ere}) 2>&- || echo failed in 17
l=t; (echo 18 "${IFS+h`echo -n i ${IFS+$l}h`ere}") 2>&- || echo failed in 18
l=t; (echo 19 "${IFS+h$(echo -n i ${IFS+$l}h)ere}") 2>&- || echo failed in 19
l=t; (echo 20 ${IFS+h`echo -n i "${IFS+$l}"h`ere}) 2>&- || echo failed in 20
l=t; (echo 21 ${IFS+h$(echo -n i "${IFS+$l}"h)ere}) 2>&- || echo failed in 21
l=t; (echo 22 "${IFS+h`echo -n i "${IFS+$l}"h`ere}") 2>&- || echo failed in 22
l=t; (echo 23 "${IFS+h$(echo -n i "${IFS+$l}"h)ere}") 2>&- || echo failed in 23
key=value; (echo -n '24 '; printf '%s\n' "${IFS+'$key'}") 2>&- || echo failed in 24
key=value; (echo -n '25 '; printf '%s\n' "${IFS+"'$key'"}") 2>&- || echo failed in 25 # ksh93: “'$key'”
key=value; (echo -n '26 '; printf '%s\n' ${IFS+'$key'}) 2>&- || echo failed in 26
key=value; (echo -n '27 '; printf '%s\n' ${IFS+"'$key'"}) 2>&- || echo failed in 27
(echo -n '28 '; printf '%s\n' "${IFS+"'"x ~ x'}'x"'}"x}" #') 2>&- || echo failed in 28
u=x; (echo -n '29 '; printf '<%s> ' foo ${IFS+a"b$u{ {"{ {\}b} c ${IFS+d{}} bar ${IFS-e{}} baz; echo .) 2>&- || echo failed in 29
(echo -n '30 '; printf '<%s> ' ${IFS+foo 'b\
ar' baz}; echo .) 2>&- || (echo failed in 30; echo failed in 31)
(echo -n '32 '; printf '<%s> ' ${IFS+foo "b\
ar" baz}; echo .) 2>&- || echo failed in 32
(echo -n '33 '; printf '<%s> ' "${IFS+foo 'b\
ar' baz}"; echo .) 2>&- || echo failed in 33
(echo -n '34 '; printf '<%s> ' "${IFS+foo "b\
ar" baz}"; echo .) 2>&- || echo failed in 34
(echo -n '35 '; printf '<%s> ' ${v=a\ b} x ${v=c\ d}; echo .) 2>&- || echo failed in 35
(echo -n '36 '; printf '<%s> ' "${v=a\ b}" x "${v=c\ d}"; echo .) 2>&- || echo failed in 36
(echo -n '37 '; printf '<%s> ' ${v-a\ b} x ${v-c\ d}; echo .) 2>&- || echo failed in 37
(echo 38 ${IFS+x'a'y} / "${IFS+x'a'y}" .) 2>&- || echo failed in 38
foo="x'a'y"; (echo 39 ${foo%*'a'*} / "${foo%*'a'*}" .) 2>&- || echo failed in 39
foo="a b c"; (echo -n '40 '; printf '<%s> ' "${foo#a}"; echo .) 2>&- || echo failed in 40
+41
View File
@@ -0,0 +1,41 @@
1
0
a
real 0.00
user 0.00
sys 0.00
1
a
real 0.00
user 0.00
sys 0.00
1
tfunc is a function
tfunc ()
{
time
}
1
0
1
a
real 0.00
user 0.00
sys 0.00
0
a
real 0.00
user 0.00
sys 0.00
0
a
real 0.00
user 0.00
sys 0.00
0
1
0
a
real 0.00
user 0.00
sys 0.00
+43
View File
@@ -0,0 +1,43 @@
# Test timed and negated pipelines in bash-4.2 and later
export TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'
!
echo $?
! !
echo $?
time ! echo a
echo $?
! time echo a
echo $?
tfunc()
{
time
}
type tfunc
! true
echo $?
! ! true
echo $?
! ! ! true
echo $?
time time echo a
echo $?
time time -p echo a
echo $?
time -p time echo a
echo $?
!
echo $?
! !
echo $?
time -p -- echo a
Binary file not shown.
+5
View File
@@ -308,4 +308,9 @@ shopt -s nullglob extglob
echo "x$(printf "%b" @(hugo))x"
printf -v var "%b" @(hugo); echo "x${var}x"
# tests variable assignment with -v
${THIS_SH} ./printf1.sub
${THIS_SH} ./printf2.sub
${THIS_SH} ./printf3.sub
+335
View File
@@ -0,0 +1,335 @@
LC_ALL=C
LC_NUMERIC=C
unset vv
# this should expand escape sequences in the format string, nothing else
printf -v vv "\tone\n"
printf "%s" "$vv"
# this should not cut off output after the \c
printf -v vv "one\ctwo\n"
printf "%s" "$vv"
# and unrecognized backslash escapes should have the backslash preserverd
printf -v vv "4\.2\n"
printf "%s" "$vv"
printf -v vv "no newline " ; printf "%s" "$vv" ; printf -v vv "now newline\n"
printf "%s" "$vv"
# %% -> %
printf -v vv "%%\n"
printf "%s" "$vv"
# 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 -v vv "\045"
printf "%s" "$vv"
echo
printf -v vv "\045d\n"
printf "%s" "$vv"
# simple character output
printf -v vv "%c\n" ABCD
printf "%s" "$vv"
# test simple string output
printf -v vv "%s\n" unquoted
printf "%s" "$vv"
# test quoted string output
printf -v vv "%s %q\n" unquoted quoted
printf "%s" "$vv"
printf -v vv "%s%10q\n" unquoted quoted
printf "%s" "$vv"
printf -v vv "%q\n" 'this&that'
printf "%s" "$vv"
# make sure the format string is reused to use up arguments
printf -v vv "%d " 1 2 3 4 5
printf "%s" "$vv"
echo
# make sure that extra format characters get null arguments
printf -v vv "%s %d %d %d\n" onestring
printf "%s" "$vv"
printf -v vv "%s %d %u %4.2f\n" onestring
printf "%s" "$vv"
printf -v vv -- "--%s %s--\n" 4.2 ''
printf "%s" "$vv"
printf -v vv -- "--%s %s--\n" 4.2
printf "%s" "$vv"
# test %b escapes
# 8 is a non-octal digit, so the `81' should be output
#printf -v vv -- "--%b--\n" '\n\081'
#printf "%s" "$vv"
printf -v vv -- "--%b--\n" '\t\0101'
printf "%s" "$vv"
printf -v vv -- "--%b--\n" '\t\101'
printf "%s" "$vv"
# these should all display `A7'
printf -v vv "%b\n" '\01017'
printf "%s" "$vv"
printf -v vv "%b\n" '\1017'
printf "%s" "$vv"
printf -v vv "%b\n" '\x417'
printf "%s" "$vv"
printf -v vv -- "--%b--\n" '\"abcd\"'
printf "%s" "$vv"
printf -v vv -- "--%b--\n" "\'abcd\'"
printf "%s" "$vv"
printf -v vv -- "--%b--\n" 'a\\x'
printf "%s" "$vv"
printf -v vv -- "--%b--\n" '\x'
printf "%s" "$vv"
Z1=$(printf -- "%b\n" '\a\b\e\f\r\v')
Z2=$'\a\b\e\f\r\v'
if [ "$Z1" != "$Z2" ]; then
printf "%s" "whoops: printf -v vv %b and $'' differ" >&2
fi
unset Z1 Z2
printf -v vv -- "--%b--\n" ''
printf "%s" "$vv"
printf -v vv -- "--%b--\n"
printf "%s" "$vv"
# the stuff following the \c should be ignored, as well as the rest
# of the format string
printf -v vv -- "--%b--\n" '4.2\c5.4\n'
printf "%s" "$vv"
echo
# unrecognized escape sequences should by displayed unchanged
printf -v vv -- "--%b--\n" '4\.2'
printf "%s" "$vv"
# a bare \ should not be processed as an escape sequence
printf -v vv -- "--%b--\n" '\'
printf "%s" "$vv"
# make sure extra arguments are ignored if the format string doesn't
# actually use them
printf -v vv "\n" 4.4 BSD
printf "%s" "$vv"
printf -v vv " " 4.4 BSD
printf "%s" "$vv"
echo
# make sure that a fieldwidth and precision of `*' are handled right
printf -v vv "%10.8s\n" 4.4BSD
printf "%s" "$vv"
printf -v vv "%*.*s\n" 10 8 4.4BSD
printf "%s" "$vv"
printf -v vv "%10.8q\n" 4.4BSD
printf "%s" "$vv"
printf -v vv "%*.*q\n" 10 8 4.4BSD
printf "%s" "$vv"
printf -v vv "%6b\n" 4.4BSD
printf "%s" "$vv"
printf -v vv "%*b\n" 6 4.4BSD
printf "%s" "$vv"
# we handle this crap with homemade code in printf -v vv.def
printf -v vv "%10b\n" 4.4BSD
printf "%s" "$vv"
printf -v vv -- "--%-10b--\n" 4.4BSD
printf "%s" "$vv"
printf -v vv "%4.2b\n" 4.4BSD
printf "%s" "$vv"
printf -v vv "%.3b\n" 4.4BSD
printf "%s" "$vv"
printf -v vv -- "--%-8b--\n" 4.4BSD
printf "%s" "$vv"
# test numeric conversions -- these four lines should printf "%s" identically
printf -v vv "%d %u %i 0%o 0x%x 0x%X\n" 255 255 255 255 255 255
printf "%s" "$vv"
printf -v vv "%d %u %i %#o %#x %#X\n" 255 255 255 255 255 255
printf "%s" "$vv"
printf -v vv "%ld %lu %li 0%o 0x%x 0x%X\n" 255 255 255 255 255 255
printf "%s" "$vv"
printf -v vv "%ld %lu %li %#o %#x %#X\n" 255 255 255 255 255 255
printf "%s" "$vv"
printf -v vv "%10d\n" 42
printf "%s" "$vv"
printf -v vv "%10d\n" -42
printf "%s" "$vv"
printf -v vv "%*d\n" 10 42
printf "%s" "$vv"
printf -v vv "%*d\n" 10 -42
printf "%s" "$vv"
# test some simple floating point formats
printf -v vv "%4.2f\n" 4.2
printf "%s" "$vv"
printf -v vv "%#4.2f\n" 4.2
printf "%s" "$vv"
printf -v vv "%#4.1f\n" 4.2
printf "%s" "$vv"
printf -v vv "%*.*f\n" 4 2 4.2
printf "%s" "$vv"
printf -v vv "%#*.*f\n" 4 2 4.2
printf "%s" "$vv"
printf -v vv "%#*.*f\n" 4 1 4.2
printf "%s" "$vv"
printf -v vv "%E\n" 4.2
printf "%s" "$vv"
printf -v vv "%e\n" 4.2
printf "%s" "$vv"
printf -v vv "%6.1E\n" 4.2
printf "%s" "$vv"
printf -v vv "%6.1e\n" 4.2
printf "%s" "$vv"
printf -v vv "%G\n" 4.2
printf "%s" "$vv"
printf -v vv "%g\n" 4.2
printf "%s" "$vv"
printf -v vv "%6.2G\n" 4.2
printf "%s" "$vv"
printf -v vv "%6.2g\n" 4.2
printf "%s" "$vv"
# test some of the more esoteric features of POSIX.1 printf -v vv
printf -v vv "%d\n" "'string'"
printf "%s" "$vv"
printf -v vv "%d\n" '"string"'
printf "%s" "$vv"
printf -v vv "%#o\n" "'string'"
printf "%s" "$vv"
printf -v vv "%#o\n" '"string"'
printf "%s" "$vv"
printf -v vv "%#x\n" "'string'"
printf "%s" "$vv"
printf -v vv "%#X\n" '"string"'
printf "%s" "$vv"
printf -v vv "%6.2f\n" "'string'"
printf "%s" "$vv"
printf -v vv "%6.2f\n" '"string"'
printf "%s" "$vv"
# output from these two lines had better be the same
printf -v vv -- "--%6.4s--\n" abcdefghijklmnopqrstuvwxyz
printf "%s" "$vv"
printf -v vv -- "--%6.4b--\n" abcdefghijklmnopqrstuvwxyz
printf "%s" "$vv"
# and these two also
printf -v vv -- "--%12.10s--\n" abcdefghijklmnopqrstuvwxyz
printf "%s" "$vv"
printf -v vv -- "--%12.10b--\n" abcdefghijklmnopqrstuvwxyz
printf "%s" "$vv"
# tests for translating \' to ' and \\ to \
# printf -v vv translates \' to ' in the format string...
printf -v vv "\'abcd\'\n"
printf "%s" "$vv"
# but not when the %b format specification is used
printf -v vv "%b\n" \\\'abcd\\\'
printf "%s" "$vv"
# but both translate \\ to \
printf -v vv '\\abcd\\\n'
printf "%s" "$vv"
printf -v vv "%b\n" '\\abcd\\'
printf "%s" "$vv"
# this was reported as a bug in bash-2.03
# these three lines should all printf "%s" `26'
printf -v vv "%d\n" 0x1a
printf "%s" "$vv"
printf -v vv "%d\n" 032
printf "%s" "$vv"
printf -v vv "%d\n" 26
printf "%s" "$vv"
# error messages
# this should be an overflow, but error messages vary between systems
# printf -v vv "%lu\n" 4294967296
# ...but we cannot use this because some systems (SunOS4, for example),
# happily ignore overflow conditions in strtol(3)
#printf -v vv "%ld\n" 4294967296
printf -v vv "%10"
printf -v vv "ab%Mcd\n"
# this caused an infinite loop in older versions of printf -v vv
printf -v vv "%y" 0
# these should print a warning and `0', according to POSIX.2
printf -v vv "%d\n" GNU
printf "%s" "$vv"
printf -v vv "%o\n" GNU
printf "%s" "$vv"
# failures in all bash versions through bash-2.05
printf -v vv "%.0s" foo
printf "%s" "$vv"
printf -v vv "%.*s" 0 foo
printf "%s" "$vv"
printf -v vv '%.0b-%.0s\n' foo bar
printf "%s" "$vv"
printf -v vv '(%*b)(%*s)\n' -4 foo -4 bar
printf "%s" "$vv"
format='%'`printf '%0100384d' 0`'d\n'
printf -v vv $format 0
printf "%s" "$vv"
# failures in all bash versions through bash-3.0 - undercounted characters
unset vv
printf -v vv " %s %s %s \n%n" ab cd ef vvv
printf "%s" "$vv"
echo $vvv
# this doesn't work with printf -v vv(3) on all systems
#printf -v vv "%'s\n" foo
# test cases from an austin-group list discussion
# prints ^G as an extension
printf -v vv '%b\n' '\7'
printf "%s" "$vv"
# prints ^G
printf -v vv '%b\n' '\0007'
printf "%s" "$vv"
# prints NUL then 7
#printf -v vv '\0007\n'
#printf "%s" "$vv"
# prints no more than two hex digits
printf -v vv '\x07e\n'
printf "%s" "$vv"
# additional backslash escapes
printf -v vv '\"\?\n'
printf "%s" "$vv"
+6
View File
@@ -0,0 +1,6 @@
export LANG=en_US.UTF-8
case $(printf %d\\n \'À) in
192) exit 0;;
*) echo "printf2.sub: multibyte character conversion failed" >&2 ; exit 2 ;;
esac
+53
View File
@@ -0,0 +1,53 @@
LC_ALL=C
LANG=C
SHELLSTART=$(date +%s)
SECS=1275250155
export TZ=EST5EDT
printf "%()T\n" $SECS
printf "%(abde)Z\n" -1
printf "%(%e-%b-%Y %T)T\n" $SECS
printf -v v1 "%(%e-%b-%Y %T)T\n" $(date +%s)
printf -v v2 "%(%e-%b-%Y %T)T\n" -1
case $v1 in
$v2) ;;
*) echo "current time and -1 possible mismatch|$v1|$v2|" >&2 ;;
esac
unset v1 v2
v1=$(date +%s)
printf -v v2 "%(%s)T" -1
case $v1 in
$v2) ;;
*) echo "current time mismatch:$v1|$v2|" >&2 ;;
esac
unset v1 v2
printf "%(%x %X)T\n" $(( $SECS - 3600 ))
printf -v v1 "%(%F %r)T\n" $SHELLSTART
printf -v v2 "%(%F %r)T\n" -2
case $v1 in
$v2) ;;
*) echo "shell start time and -2 possible mismatch|$v1|$v2|" >&2 ;;
esac
unset v1 v2
printf "current time: %(%F %r)T\n" $SECS
printf "epoch time: %(%F %r %z)T\n" 0
printf "random time: %(%F %r %z)T\n" $SECS
printf "local time: %(%a %b %e %H:%M:%S %Z %Y)T\n" $SECS
# test fieldwidth, justification, precision
printf "%-40.50(%a %b %e %H:%M:%S %Z %Y)T date-style time\n" $SECS
# test fieldwidth, justification, precision, embedded parens
printf "%-40.50(%x (foo) %X)T date-style time\n" $SECS
+1 -1
View File
@@ -59,7 +59,7 @@ argv[1] = <>
argv[2] = <>
argv[3] = <>
FOO
0 0 0
0 0 0
0
0
1
+1 -2
View File
@@ -32,5 +32,4 @@ else
fi
echo -n ${A[0]} | cat -vet
echo -n ${A[0]} | wc
echo -n ${A[0]} | wc | ( IFS=$' \t\n' ; while read line; do echo $line; done; )
+1 -1
View File
@@ -7,7 +7,7 @@
./rsh.tests: line 21: /tmp/restricted: restricted: cannot redirect output
./rsh.tests: line 26: command: -p: restricted
./rsh.tests: line 28: set: +r: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
./rsh.tests: line 29: set: restricted: invalid option name
./rsh.tests: line 31: exec: restricted
./rsh.tests: after exec
+4
View File
@@ -0,0 +1,4 @@
PATH=$PATH:`pwd`
export PATH
${THIS_SH} ./globstar.tests > /tmp/xx 2>&1
diff /tmp/xx globstar.right && rm -f /tmp/xx
+2
View File
@@ -0,0 +1,2 @@
${THIS_SH} ./lastpipe.tests > /tmp/xx 2>&1
diff /tmp/xx lastpipe.right && rm -f /tmp/xx
+1 -1
View File
@@ -27,7 +27,7 @@ do
*.orig|*~) ;;
run-dollars|run-execscript|run-func|run-getopts|run-heredoc) echo $x ; sh $x ;;
run-ifs-tests|run-input-test|run-invert|run-more-exp|run-nquote) echo $x ; sh $x ;;
run-ifs-posix|run-posix2|run-posixpat) echo $x ; sh $x ;;
run-ifs-posix|run-posix2|run-posixpat|run-posixpipe) echo $x ; sh $x ;;
run-precedence|run-quote|run-read|run-rhs-exp|run-strip|run-tilde) echo $x ; sh $x ;;
*) ;;
esac
+2
View File
@@ -0,0 +1,2 @@
${THIS_SH} ./posixexp.tests > /tmp/xx 2>&1
diff /tmp/xx posixexp.right && rm -f /tmp/xx
+2
View File
@@ -0,0 +1,2 @@
${THIS_SH} ./posixexp2.tests > /tmp/xx 2>&1
diff /tmp/xx posixexp2.right && rm -f /tmp/xx
+2
View File
@@ -0,0 +1,2 @@
${THIS_SH} ./posixpipe.tests > /tmp/xx 2>&1
diff /tmp/xx posixpipe.right && rm -f /tmp/xx
+2
View File
@@ -0,0 +1,2 @@
${THIS_SH} ./vredir.tests > /tmp/xx 2>&1
diff /tmp/xx vredir.right && rm -f /tmp/xx
+25
View File
@@ -0,0 +1,25 @@
: ${TMPDIR:=/var/tmp}
TRACEFILE=$TMPDIR/bash-trace-$$
trap 'rm -f $TRACEFILE' 0 1 2 3 6 15
exec 4>$TRACEFILE
BASH_XTRACEFD=4
set -x
echo 1
echo 2
echo 3
echo 4
unset BASH_XTRACEFD
for f in a b c d e; do echo $f ; done
set +x
echo TRACEFILE:
cat $TRACEFILE
echo =====
exit 0
+6
View File
@@ -11,6 +11,7 @@ shopt -s cmdhist
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u compat41
shopt -u dirspell
shopt -u dotglob
shopt -u execfail
@@ -28,6 +29,7 @@ shopt -u histverify
shopt -s hostcomplete
shopt -u huponexit
shopt -s interactive_comments
shopt -u lastpipe
shopt -u lithist
shopt -u login_shell
shopt -u mailwarn
@@ -65,6 +67,7 @@ shopt -u checkwinsize
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u compat41
shopt -u dirspell
shopt -u dotglob
shopt -u execfail
@@ -77,6 +80,7 @@ shopt -u histappend
shopt -u histreedit
shopt -u histverify
shopt -u huponexit
shopt -u lastpipe
shopt -u lithist
shopt -u login_shell
shopt -u mailwarn
@@ -96,6 +100,7 @@ checkwinsize off
compat31 off
compat32 off
compat40 off
compat41 off
dirspell off
dotglob off
execfail off
@@ -108,6 +113,7 @@ histappend off
histreedit off
histverify off
huponexit off
lastpipe off
lithist off
login_shell off
mailwarn off
+7 -1
View File
@@ -180,6 +180,12 @@ t -o allexport
1
t ! -o allexport
0
t -v unset
1
t -v set
0
t -v set
0
t xx -a yy
0
t xx -o ""
@@ -266,7 +272,7 @@ b ( 1 = 2
2
./test.tests: line 13: test: too many arguments
2
./test.tests: line 406: [: missing `]'
./test.tests: line 418: [: missing `]'
2
./test.tests: line 13: test: (: unary operator expected
2
+12
View File
@@ -286,12 +286,24 @@ t -n abcd -a aaa
echo 't -n abcd -a -z aaa'
t -n abcd -a -z aaa
# test set or unset shell options
set +o allexport
echo 't -o allexport'
t -o allexport
echo 't ! -o allexport'
t ! -o allexport
#test set or unset shell variables
unset unset
echo 't -v unset'
t -v unset
set=
echo 't -v set'
t -v set
set=set
echo 't -v set'
t -v set
echo 't xx -a yy'
t xx -a yy
echo 't xx -o ""'
+1
View File
@@ -53,6 +53,7 @@ trap -- 'echo aborting' SIGQUIT
trap -- 'echo aborting' SIGABRT
trap -- 'echo aborting' SIGTERM
0
trap -- '' SIGUSR2
ERRTRAP
ERRTRAP
ERRTRAP
-1
View File
@@ -90,4 +90,3 @@ trap
trap - SIGCHLD
wait
+9
View File
@@ -0,0 +1,9 @@
PS4='+[$LINENO] '
trap 'echo trap: $LINENO' ERR
set -x
echo 1
echo 2
echo 3 | cat | false
echo 4
+16
View File
@@ -80,3 +80,19 @@ qux
bar
qux
foo is a function
foo ()
{
rm -f a b c;
for f in a b c;
do
cat >> ${f} <<-EOF
file
EOF
done
grep . a b c
}
a:file
b:file
c:file
+2
View File
@@ -91,3 +91,5 @@ type f | cat -v
${THIS_SH} type1.sub
${THIS_SH} type2.sub
${THIS_SH} type3.sub
+16
View File
@@ -0,0 +1,16 @@
foo()
{
echo
cat <<END
bar
END
cat <<EOF
qux
EOF
}
type foo
foo
eval "$(type foo | sed 1d)"
foo
+18
View File
@@ -0,0 +1,18 @@
cd ${TMPDIR:-/tmp}
foo() {
rm -f a b c
for f in a b c; do
cat <<-EOF >> ${f}
file
EOF
done
grep . a b c
}
type foo
eval "$(type foo | sed 1d)"
foo
rm -f a b c
+94
View File
@@ -0,0 +1,94 @@
10
foo 1
foo 2
foo 3
bar is a function
bar ()
{
exec {v}> $TMPFILE;
echo $v
}
./vredir.tests: line 6: v: readonly variable
./vredir.tests: line 6: v: cannot assign fd to variable
42
./vredir.tests: line 25: $v: Bad file descriptor
./vredir.tests: line 26: $v: Bad file descriptor
./vredir.tests: line 27: $v: Bad file descriptor
bar is a function
bar ()
{
exec {v}> $TMPFILE;
echo $v
}
11
line 1
line 2
line 3
bar is a function
bar ()
{
exec {v}<<EOF
line 1
line 2
line 3
EOF
echo $v
}
11
foo 1
foo 2
foo 3
11
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
oclosev is a function
oclosev ()
{
exec {v}>&-
}
iclosev is a function
iclosev ()
{
exec {v}>&-
}
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
./vredir3.sub: line 4: v: ambiguous redirect
after
11 12
a
a
swizzle is a function
swizzle ()
{
fd0=0;
fd1=1;
exec {stdin}<&$fd0;
exec {stdout}>&$fd1
}
13 11
a
a
swizzle is a function
swizzle ()
{
exec {fd0}<&0;
exec {fd1}>&1;
exec {stdin}<&$fd0-;
exec {stdout}>&$fd1-
}
ok 1
./vredir6.sub: redirection error: cannot duplicate fd: Invalid argument
./vredir6.sub: line 10: /dev/null: Invalid argument
./vredir6.sub: redirection error: cannot duplicate fd: Invalid argument
./vredir6.sub: line 13: v: Invalid argument
unset
+46
View File
@@ -0,0 +1,46 @@
: ${TMPDIR:=/var/tmp}
TMPFILE=$TMPDIR/foo
bar()
{
exec {v}>$TMPFILE
echo $v
}
bar
echo foo 1 >&$v
echo foo 2 >&$v
echo foo 3 >&$v
cat $TMPFILE
rm -f $TMPFILE
type bar
exec {v}>&-
readonly v=42
bar
echo foo 1 >&$v
echo foo 2 >&$v
echo foo 3 >&$v
cat $TMPFILE
rm -f $TMPFILE
type bar
${THIS_SH} ./vredir1.sub
${THIS_SH} ./vredir2.sub
${THIS_SH} ./vredir3.sub
${THIS_SH} ./vredir4.sub
${THIS_SH} ./vredir5.sub
${THIS_SH} ./vredir6.sub
exit 0
+17
View File
@@ -0,0 +1,17 @@
bar()
{
exec {v}<<EOF
line 1
line 2
line 3
EOF
echo $v
}
bar
cat <&$v
type bar
exit 0
+52
View File
@@ -0,0 +1,52 @@
: ${TMPDIR:=/var/tmp}
SHELLSFILE=$TMPDIR/shells-$$
cat > $TMPDIR/shells-$$ <<EOF
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
EOF
oclosev()
{
exec {v}>&-
}
iclosev()
{
exec {v}<&-
}
exec {v}>&1
echo $v
echo foo 1 >&$v
echo foo 2 >&$v
echo foo 3 >&$v
oclosev
exec {v}<$SHELLSFILE
echo $v
while read line <&$v
do
echo $line
done
iclosev
type oclosev
type iclosev
while read -r -u ${fd}
do
echo $REPLY
done {fd}<$SHELLSFILE
rm -f $SHELLSFILE
exit 0
+8
View File
@@ -0,0 +1,8 @@
# Right now, the {varname} mechanism does not honor set -u for compatibility
unset v
set -u
exec {v}>&-
echo after
exit 0
+22
View File
@@ -0,0 +1,22 @@
swizzle()
{
fd0=0
fd1=1
exec {stdin}<&$fd0
exec {stdout}>&$fd1
}
swizzle
echo $stdin $stdout
read line <&$stdin <<EOF
a
EOF
echo $line
echo $line >&$stdout
type swizzle
exit 0
+23
View File
@@ -0,0 +1,23 @@
swizzle()
{
exec {fd0}<&0
exec {fd1}>&1
exec {stdin}<&$fd0-
exec {stdout}>&$fd1-
}
swizzle
echo $stdin $stdout
read line <&$stdin <<EOF
a
EOF
echo $line
echo $line >&$stdout
type swizzle
exit 0
+14
View File
@@ -0,0 +1,14 @@
unset v
exec {v}</dev/null
if (( v >= 10 )); then echo ok 1; else echo bad 1; fi
exec {v}<&-
ulimit -n 6
exec </dev/null
unset v
exec {v}</dev/null
echo ${v-unset}