mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-08-05 17:52:30 +02:00
Bash-4.2 distribution sources and documentation
This commit is contained in:
@@ -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
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,10 @@
|
||||
x=$(( !!1 ))
|
||||
echo $x
|
||||
|
||||
x=$(( -!+1 ))
|
||||
echo $x
|
||||
|
||||
x=$(( +--+!!0 ))
|
||||
echo $x
|
||||
|
||||
echo $(( !!+-+-~0 ))
|
||||
@@ -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
|
||||
|
||||
@@ -386,3 +386,5 @@ ${THIS_SH} ./array7.sub
|
||||
${THIS_SH} ./array8.sub
|
||||
|
||||
${THIS_SH} ./array9.sub
|
||||
|
||||
${THIS_SH} ./array10.sub
|
||||
|
||||
@@ -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++]#?}
|
||||
@@ -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=
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
e=$(cat <<EOF
|
||||
contents
|
||||
EOF)
|
||||
echo $e
|
||||
@@ -0,0 +1,9 @@
|
||||
echo $(
|
||||
cat <<\)
|
||||
hi
|
||||
))
|
||||
|
||||
echo $(
|
||||
cat <<\EOF
|
||||
hi
|
||||
EOF)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -0,0 +1,9 @@
|
||||
set -u
|
||||
|
||||
echo ${#@}
|
||||
echo ${@:-bar}
|
||||
|
||||
echo $@
|
||||
echo after 1
|
||||
echo ${@}
|
||||
echo after 2
|
||||
@@ -0,0 +1,9 @@
|
||||
set -u
|
||||
|
||||
echo ${#*}
|
||||
echo ${*:-bar}
|
||||
|
||||
echo $*
|
||||
echo after 1
|
||||
echo ${*}
|
||||
echo after 2
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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 $?
|
||||
@@ -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
|
||||
|
||||
@@ -166,3 +166,7 @@ graph
|
||||
yes
|
||||
a
|
||||
a
|
||||
val
|
||||
val
|
||||
val
|
||||
no arg passed
|
||||
|
||||
@@ -384,3 +384,5 @@ ${THIS_SH} ./exp1.sub
|
||||
${THIS_SH} ./exp2.sub
|
||||
|
||||
${THIS_SH} ./exp3.sub
|
||||
|
||||
${THIS_SH} ./exp4.sub
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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
@@ -140,7 +140,7 @@ three
|
||||
one
|
||||
two
|
||||
three
|
||||
4.1
|
||||
4.2
|
||||
echo ${BASH_VERSION%\.*}
|
||||
4.1
|
||||
4.2
|
||||
echo ${BASH_VERSION%\.*}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 $?
|
||||
@@ -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
@@ -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
File diff suppressed because one or more lines are too long
+5
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
set -o history
|
||||
set -H
|
||||
|
||||
echo $'hello\' world'
|
||||
echo $'hello world!'
|
||||
echo $'hello\' world!'
|
||||
@@ -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
|
||||
@@ -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}"
|
||||
@@ -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
|
||||
@@ -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> .
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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
@@ -59,7 +59,7 @@ argv[1] = <>
|
||||
argv[2] = <>
|
||||
argv[3] = <>
|
||||
FOO
|
||||
0 0 0
|
||||
0 0 0
|
||||
0
|
||||
0
|
||||
1
|
||||
|
||||
+1
-2
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
${THIS_SH} ./lastpipe.tests > /tmp/xx 2>&1
|
||||
diff /tmp/xx lastpipe.right && rm -f /tmp/xx
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
${THIS_SH} ./posixexp.tests > /tmp/xx 2>&1
|
||||
diff /tmp/xx posixexp.right && rm -f /tmp/xx
|
||||
@@ -0,0 +1,2 @@
|
||||
${THIS_SH} ./posixexp2.tests > /tmp/xx 2>&1
|
||||
diff /tmp/xx posixexp2.right && rm -f /tmp/xx
|
||||
@@ -0,0 +1,2 @@
|
||||
${THIS_SH} ./posixpipe.tests > /tmp/xx 2>&1
|
||||
diff /tmp/xx posixpipe.right && rm -f /tmp/xx
|
||||
@@ -0,0 +1,2 @@
|
||||
${THIS_SH} ./vredir.tests > /tmp/xx 2>&1
|
||||
diff /tmp/xx vredir.right && rm -f /tmp/xx
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 ""'
|
||||
|
||||
@@ -53,6 +53,7 @@ trap -- 'echo aborting' SIGQUIT
|
||||
trap -- 'echo aborting' SIGABRT
|
||||
trap -- 'echo aborting' SIGTERM
|
||||
0
|
||||
trap -- '' SIGUSR2
|
||||
ERRTRAP
|
||||
ERRTRAP
|
||||
ERRTRAP
|
||||
|
||||
@@ -90,4 +90,3 @@ trap
|
||||
|
||||
trap - SIGCHLD
|
||||
wait
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
PS4='+[$LINENO] '
|
||||
trap 'echo trap: $LINENO' ERR
|
||||
|
||||
set -x
|
||||
|
||||
echo 1
|
||||
echo 2
|
||||
echo 3 | cat | false
|
||||
echo 4
|
||||
@@ -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
|
||||
|
||||
@@ -91,3 +91,5 @@ type f | cat -v
|
||||
${THIS_SH} type1.sub
|
||||
|
||||
${THIS_SH} type2.sub
|
||||
|
||||
${THIS_SH} type3.sub
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
foo()
|
||||
{
|
||||
echo
|
||||
cat <<END
|
||||
bar
|
||||
END
|
||||
cat <<EOF
|
||||
qux
|
||||
EOF
|
||||
}
|
||||
|
||||
type foo
|
||||
foo
|
||||
|
||||
eval "$(type foo | sed 1d)"
|
||||
foo
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,17 @@
|
||||
bar()
|
||||
{
|
||||
exec {v}<<EOF
|
||||
line 1
|
||||
line 2
|
||||
line 3
|
||||
EOF
|
||||
echo $v
|
||||
}
|
||||
|
||||
bar
|
||||
|
||||
cat <&$v
|
||||
|
||||
type bar
|
||||
|
||||
exit 0
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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}
|
||||
Reference in New Issue
Block a user