bash-4.4 beta2 release

This commit is contained in:
Chet Ramey
2016-07-11 16:52:30 -04:00
parent 690150f9e5
commit a4eef1991c
205 changed files with 21194 additions and 15639 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
THIS=alias2
FN=$THIS.script
FN=$TMPDIR/$THIS.script
cat > $FN <<'EOF'
#
+16
View File
@@ -32,3 +32,19 @@ xyz
/tmp/foo/bar
/tmp/foo/bar
/tmp/foo/bar
1
2
3
4
5
6
5
6
a
b
c
a
b
c
1
2
+1
View File
@@ -46,3 +46,4 @@ echo ${foo:-$(echo a{b,c})} >/dev/null
${THIS_SH} ./comsub1.sub
${THIS_SH} ./comsub2.sub
${THIS_SH} ./comsub3.sub
+31
View File
@@ -0,0 +1,31 @@
x=$(
case 1 in
1) echo 1
esac
case 2 in
2) echo 2
esac
)
echo "$x"
x=$(case 1 in 1) echo 3;; esac; case 2 in 2) echo 4;; esac;)
echo "$x"
x=$(case 1 in 1) echo 5;; esac; case 2 in 2) echo 6;; esac)
echo "$x"
x=$(case 1 in 1) echo 5;; esac; case 2 in 2) echo 6;; esac; for f in a b c; do echo "$f" ; done)
echo "$x"
x=$(
for f in a b c; do
echo $f
done
case 1 in
1) echo 1
esac
case 2 in
2) echo 2
esac
)
echo "$x"
+2 -2
View File
@@ -24,11 +24,11 @@ env -i BASH_FUNC_X%%='() { (a)=>\' ${THIS_SH} -c cve7169-bad 2>/dev/null
: < cve7169-bad
rm -f cve7169-bad
echo cve7169-bad2 > bar
echo cve7169-bad2 > $TMPDIR/bar
rm -f cve7169-bad2
eval 'X() { (a)>\' ; . ./bar 2>/dev/null
: < cve7169-bad2
rm -f cve7169-bad2 bar
rm -f cve7169-bad2 $TMPDIR/bar
# CVE-2014-7186
${THIS_SH} ./exportfunc1.sub
+5
View File
@@ -100,3 +100,8 @@ a.log
a.log
. ..
a.log
.x .y .z
a b c
.x .y .z a b c
a b c
a b c
+2
View File
@@ -372,4 +372,6 @@ ${THIS_SH} ./extglob1a.sub
${THIS_SH} ./extglob3.sub
${THIS_SH} ./extglob4.sub
exit 0
+7
View File
@@ -0,0 +1,7 @@
LANG=en_US.UTF-8
shopt -s extglob
a="aaaäöü"
echo "${a}" "${a//?aa}" "${a//\aaa}"
exit 0
+25
View File
@@ -0,0 +1,25 @@
LANG=C
LC_ALL=C
: ${TMPDIR:=/tmp}
GTDIR=$TMPDIR/extglob4-$$
shopt -s extglob
[ -d "${GTDIR}" ] || mkdir "${GTDIR}"
cd "${GTDIR}" || {
echo "extglob4: cannot cd to ${GTDIR}"
exit 2
}
touch a b c .x .y .z
echo .!(|.) # correct
echo * # correct
echo @(*|.!(|.)) # wrong, adds . and ..
echo @(*|@(f)) # ??
echo @(*|@(ff))
cd /
rm -rf $GTDIR
[[ a = a*?(/)b ]] && echo bad match 1
+5
View File
@@ -61,3 +61,8 @@ opt: b
opt: c
opt: z
$1 = a
./getopts10.sub: line 3: OPTARG: readonly variable
OPTARG = x = ?
unset x = ?
declare -r RO="foo"
declare -r RO="foo"
+2
View File
@@ -39,3 +39,5 @@ ${THIS_SH} ./getopts7.sub -a
${THIS_SH} ./getopts8.sub
${THIS_SH} ./getopts9.sub
${THIS_SH} ./getopts10.sub
+17
View File
@@ -0,0 +1,17 @@
set -- -a bb
readonly OPTARG
getopts :x x
echo OPTARG = $OPTARG x = $x
getopts x x
echo ${OPTARG-unset} x = $x
typeset -r RO=foo
typeset -n OPTARG=RO
getopts :x x
typeset -p RO
getopts x x
typeset -p RO
+6 -6
View File
@@ -59,13 +59,13 @@ qux
bar
qux
abc def geh
./heredoc3.sub: line 6: warning: here-document at line 4 delimited by end-of-file (wanted `EOF')
./heredoc3.sub: line 9: warning: here-document at line 7 delimited by end-of-file (wanted `EOF')
= here is the text =
./heredoc3.sub: line 12: warning: here-document at line 10 delimited by end-of-file (wanted `EOF')
./heredoc3.sub: line 15: warning: here-document at line 13 delimited by end-of-file (wanted `EOF')
this paren ) is not a problem
./heredoc3.sub: line 18: warning: here-document at line 16 delimited by end-of-file (wanted `EOF')
./heredoc3.sub: line 21: warning: here-document at line 19 delimited by end-of-file (wanted `EOF')
these balanced parens ( ) are not a problem
./heredoc3.sub: line 24: warning: here-document at line 22 delimited by end-of-file (wanted `EOF')
./heredoc3.sub: line 27: warning: here-document at line 25 delimited by end-of-file (wanted `EOF')
quoted balanced parens \( ) are not a problem either
more text in a subshell
some more text in a different subshell
@@ -82,8 +82,8 @@ end helloEND
hello
\END
end hello<NL>\END
./heredoc3.sub: line 75: warning: here-document at line 73 delimited by end-of-file (wanted `EOF')
./heredoc3.sub: line 76: syntax error: unexpected end of file
./heredoc3.sub: line 78: warning: here-document at line 76 delimited by end-of-file (wanted `EOF')
./heredoc3.sub: line 79: syntax error: unexpected end of file
comsub here-string
./heredoc.tests: line 105: warning: here-document at line 103 delimited by end-of-file (wanted `EOF')
hi
+3
View File
@@ -1,3 +1,6 @@
SAVEPWD=$PWD
cd $TMPDIR || echo "heredoc3.sub: cannot cd to $TMPDIR" >&2
text=$(cat <<EOF
here is the text
EOF)
+6 -1
View File
@@ -129,7 +129,12 @@ ok 2
ok 3
echo shopt a
shopt a
echo a b c d 2 > /dev/null
echo a b c d 2> /dev/null
a b c d
one two three four
echo two ; echo four
one two three four
echo four ; echo two
!
!
!
+8
View File
@@ -123,11 +123,19 @@ echo ${!var2}
# history_comment_char
echo ok 3 # !1200
# bash versions through bash-4.3 fail this; they make the digit preceding the
# > into a separate word, changing the meaning of the redirection
shopt a b c d 2>/dev/null
echo !shopt-1
echo !shopt*
# make sure a :p modifier anywhere on the line affects all history expansions
echo one two three four
echo !:2:p ; echo !$
echo one two three four
echo !$ ; echo !:2:p
${THIS_SH} ./histexp1.sub
${THIS_SH} ./histexp2.sub
${THIS_SH} ./histexp3.sub
+1 -1
View File
@@ -109,6 +109,6 @@ shopt -q -o history
echo $?
${THIS_SH} ./history1.sub
rm foohist-*
rm -f $TMPDIR/foohist-*
${THIS_SH} ./history2.sub
+1 -1
View File
@@ -1,6 +1,6 @@
trap 'rm -f $HISTFILE' 0 1 2 3 6 15
HISTFILE=foohist-$$
HISTFILE=$TMPDIR/foohist-$$
unset HISTIGNORE HISTCONTROL
set -o history
+10
View File
@@ -8,3 +8,13 @@ last = c
1 -- 0 0 1
1 -- 0 1 0
lastpipe1.sub returns 14
A1
A2
B1
B2
HI
A1
A2
B1
B2
HI -- 42 -- 0 42
+3
View File
@@ -56,3 +56,6 @@ set +o pipefail
${THIS_SH} ./lastpipe1.sub
echo lastpipe1.sub returns $?
${THIS_SH} ./lastpipe2.sub
+30
View File
@@ -0,0 +1,30 @@
shopt -s lastpipe
echo -e 'A\nB' | while read letter; do
echo -e '1\n2' | while read digit; do
echo $letter$digit
done
done
myPipefunc()
{
cat | tee $TMPDIR/outfile
}
echo HI | myPipefunc
echo -e 'A\nB' | while read letter; do
echo -e '1\n2' | while read digit; do
echo $letter$digit | myPipefunc
done
done
rm -f $TMPDIR/outfile
unset -f myPipefunc
myPipefunc()
{
cat | read var
return 42
}
echo HI | myPipefunc
echo $var -- $? -- ${PIPESTATUS[@]}
+244 -1
View File
@@ -27,7 +27,7 @@ changevar: expect <three four five>
argv[1] = <three four five>
expect <three four five>
argv[1] = <three four five>
./nameref.tests: line 93: bar: readonly variable
./nameref.tests: line 93: foo: readonly variable
./nameref.tests: line 94: foo: readonly variable
one
one
@@ -111,6 +111,7 @@ ref -> two, value: 2
ref -> three, value: 3
final state: ref -> three, value: 3
./nameref6.sub: line 2: typeset: x: nameref variable self references not allowed
./nameref6.sub: line 5: typeset: x[3]: reference variable cannot be an array
./nameref6.sub: line 12: typeset: x: reference variable cannot be an array
the -- 1
42 -- 0
@@ -120,10 +121,19 @@ y -- 0
y -- 0
bar
unset
./nameref8.sub: line 3: typeset: warning: v: circular name reference
./nameref8.sub: line 3: warning: v: circular name reference
./nameref8.sub: line 5: warning: v: circular name reference
inside
inside: two
outside:
./nameref8.sub: line 29: typeset: warning: x: circular name reference
./nameref8.sub: line 29: warning: x: circular name reference
./nameref8.sub: line 31: warning: x: circular name reference
foo
./nameref8.sub: line 38: typeset: warning: v: circular name reference
./nameref8.sub: line 38: warning: v: circular name reference
./nameref8.sub: line 38: warning: v: circular name reference
local
./nameref8.sub: line 47: typeset: v: nameref variable self references not allowed
./nameref8.sub: line 54: warning: x: circular name reference
@@ -166,3 +176,236 @@ declare -i bar="8"
8
declare -n foo="bar"
./nameref10.sub: line 64: typeset: bar: not found
./nameref11.sub: line 1: declare: `/': invalid variable name for name reference
./nameref11.sub: line 2: declare: `/': invalid variable name for name reference
./nameref11.sub: line 3: `/': not a valid identifier
./nameref11.sub: line 4: declare: `/': not a valid identifier
./nameref11.sub: line 5: `/': not a valid identifier
1) /
#? ./nameref11.sub: line 6: `/': not a valid identifier
x
./nameref11.sub: line 7: ((: `0': not a valid identifier
./nameref11.sub: line 8: declare: `0': invalid variable name for name reference
./nameref11.sub: line 9: declare: `/': invalid variable name for name reference
./nameref11.sub: line 10: declare: `/': invalid variable name for name reference
/
./nameref11.sub: line 12: `/': not a valid identifier
./nameref11.sub: line 13: exec: `10': not a valid identifier
./nameref11.sub: line 13: r: cannot assign fd to variable
./nameref11.sub: line 14: warning: r: removing nameref attribute
63
./nameref11.sub: line 15: declare: RO: readonly variable
./nameref11.sub: line 15: RO: readonly variable
./nameref11.sub: line 16: declare: `/': invalid variable name for name reference
/
./nameref11.sub: line 17: declare: `/': invalid variable name for name reference
./nameref11.sub: illegal option -- h
./nameref11.sub: line 18: getopts: `?': not a valid identifier
./nameref11.sub: line 19: warning: r: removing nameref attribute
declare -a r=()
./nameref11.sub: line 20: declare: r: reference variable cannot be an array
./nameref11.sub: line 21: printf: `/': not a valid identifier
./nameref11.sub: line 23: `': not a valid identifier
./nameref11.sub: line 24: declare: `': not a valid identifier
./nameref11.sub: line 25: `': not a valid identifier
./nameref11.sub: line 26: printf: `': not a valid identifier
./nameref11.sub: line 27: declare: `': invalid variable name for name reference
declare -r ROVAR="42"
./nameref11.sub: line 32: ROVAR: readonly variable
./nameref11.sub: line 32: ROVAR: cannot unset: readonly variable
declare -r ROVAR="42"
./nameref11.sub
./nameref11.sub: line 34: `@': not a valid identifier
./nameref11.sub
declare -n ref="x"
./nameref11.sub: line 39: RO: readonly variable
declare -r RO_PID
./nameref11.sub: line 39: RO: cannot unset: readonly variable
declare -r RO="x"
./nameref11.sub: line 39: declare: RO_PID: not found
./nameref11.sub: line 41: RO2: readonly variable
declare -r RO2="a"
./nameref12.sub: line 6: declare: `/': invalid variable name for name reference
./nameref12.sub: line 9: declare: `%': invalid variable name for name reference
./nameref12.sub: line 13: `^': not a valid identifier
declare -n r
declare -a foo
declare -a foo=([0]="7")
./nameref12.sub: line 26: declare: `42': not a valid identifier
./nameref12.sub: line 27: declare: x: not found
declare -nr RO="foo"
/
./nameref12.sub: line 45: declare: `7*6': not a valid identifier
./nameref12.sub: line 45: declare: foo: not found
./nameref12.sub: line 47: `7*6': not a valid identifier
declare -n ref="var"
declare -n ref="var"
./nameref12.sub: line 74: readonly: `var[0]': not a valid identifier
declare -- var="foo"
declare -r var2="foo"
declare -n ref="var"
declare -a var=([0]="foo")
./nameref12.sub: line 91: `': not a valid identifier
declare -n ref
declare -- ref="global"
declare -a var=([0]="foo2")
./nameref12.sub: line 100: declare: global: not found
declare -- a
declare -n r="a"
declare -- a
declare -n r="a"
0
declare -n r="P"
declare -n ref="var"
declare -- a
declare -n r="a"
0
declare -n r
declare -n r
./nameref13.sub: line 88: typeset: `12345': invalid variable name for name reference
declare -n foo
./nameref13.sub: line 97: typeset: `12345': invalid variable name for name reference
declare -n foo
declare -nx ref="var"
var
var
var
var
foo
foo
foo
foo
before
declare -n ref="var"
./nameref14.sub: line 23: typeset: var: not found
first
declare -n ref="var"
declare -x var="xxx"
invalid
declare -n ref="var"
declare -x var="5"
after
declare -n ref="var"
./nameref14.sub: line 32: typeset: var: not found
declare -n ref="var"
./nameref15.sub: line 1: local: warning: a: circular name reference
./nameref15.sub: line 1: warning: a: circular name reference
./nameref15.sub: line 1: `a[0]': not a valid identifier
declare -a a=([0]="0")
./nameref15.sub: line 1: local: warning: a: circular name reference
./nameref15.sub: line 1: warning: a: circular name reference
./nameref15.sub: line 1: warning: a: circular name reference
declare -a a=([0]="X")
declare -a b=([0]="X")
./nameref15.sub: line 1: local: warning: a: circular name reference
./nameref15.sub: line 1: warning: a: circular name reference
./nameref15.sub: line 1: `a[0]': not a valid identifier
declare -a b=([0]="0")
./nameref15.sub: line 19: typeset: warning: ref: circular name reference
./nameref15.sub: line 19: warning: ref: circular name reference
./nameref15.sub: line 20: warning: ref: circular name reference
./nameref15.sub: line 21: warning: ref: circular name reference
inside
outside X
./nameref15.sub: line 29: typeset: ref: nameref variable self references not allowed
./nameref15.sub: line 31: ref: nameref variable self references not allowed
declare -n ref="re"
declare -n ref="re"
declare -- re="4"
4
declare -n foo="var[@]"
declare -n ref="var[@]"
./nameref15.sub: line 48: var[@]: bad array subscript
declare -n bar="var[@]"
./nameref15.sub: line 53: var[@]: bad array subscript
declare -n a="b"
declare -n b="a[1]"
./nameref15.sub: line 61: warning: a: removing nameref attribute
declare -a a=([1]="foo")
declare -n b="a[1]"
./nameref15.sub: line 66: warning: a: removing nameref attribute
declare -a a=([1]="foo")
declare -n b="a[1]"
declare -n n="v"
declare -a v=([1]="1")
./nameref15.sub: line 82: typeset: n: not found
declare -a v=([0]="0" [1]="1")
declare -n n="v[1]"
declare -a v=([0]="0")
declare -n r1="y"
declare -n r2="x"
./nameref16.sub: line 12: typeset: x: not found
./nameref16.sub: line 12: typeset: y: not found
declare -n r1="y"
declare -n r2="x"
./nameref16.sub: line 21: typeset: x: not found
./nameref16.sub: line 21: typeset: y: not found
declare -n r1="y"
declare -n r2="x"
./nameref16.sub: line 33: typeset: x: not found
./nameref16.sub: line 33: typeset: y: not found
declare -n r1="y"
declare -n r2="x"
declare -- x="one"
declare -- y="two"
./nameref17.sub: line 8: declare: bar: not found
./nameref17.sub: line 9: unset: foo0: cannot unset: readonly variable
declare -nr foo0="bar"
declare -nr foo0="bar"
declare -- bar
./nameref17.sub: line 14: declare: foo0: readonly variable
./nameref17.sub: line 15: declare: foo0: readonly variable
declare -nr foo1
./nameref17.sub: line 24: typeset: foo1: readonly variable
declare -nr foo1
declare -n foo2="bar"
declare -r bar
./nameref17.sub: line 35: bar: readonly variable
./nameref17.sub: line 36: typeset: bar: readonly variable
declare -n foo2="bar"
declare -r bar
declare -- bar3="three"
./nameref17.sub: line 46: unset: foo3: cannot unset: readonly variable
./nameref17.sub: line 49: declare: bar3: readonly variable
declare -nr foo3="bar3"
declare -r bar3="three"
./nameref17.sub: line 51: declare: foo3: readonly variable
declare -nr foo4="bar4"
declare -- bar4="four"
./nameref17.sub: line 63: typeset: foo4: readonly variable
declare -nr foo4="bar4"
declare -nr foo4="bar4"
declare -- bar4="four"
./nameref17.sub: line 79: typeset: foo4: readonly variable
declare -nr foo4="bar4"
declare -nr foo4="bar4"
declare -- bar4="four"
declare -nr foo5
declare -r foo5
declare -nr foo5
declare -r foo5
./nameref18.sub: line 2: mapfile: `XXX[0]': not a valid identifier
./nameref18.sub: line 3: declare: XXX[0]: not found
./nameref18.sub: line 9: `XXX[0]': not a valid identifier
./nameref18.sub: line 10: declare: XXX[0]: not found
declare -n ref="XXX[0]"
declare -a XXX=([0]="4")
./nameref18.sub: line 24: `XXX[0]': not a valid identifier
declare -n ref="XXX[0]"
./nameref18.sub: line 25: declare: XXX[0]: not found
./nameref18.sub: line 29: read: `XXX[0]': not a valid identifier
./nameref18.sub: line 30: declare: XXX[0]: not found
./nameref18.sub: line 35: `XXX[0]': not a valid identifier
declare -n ref="XXX[0]"
./nameref18.sub: line 38: `XXX[0]': not a valid identifier
./nameref18.sub: line 38: declare: XXX[0]: not found
declare -n ref="var[123]"
./nameref18.sub: line 46: declare: var[123]: not found
declare -a var=([123]="")
declare -n ref="var[123]"
./nameref18.sub: line 50: declare: var[123]: not found
declare -a var=([123]="")
declare -n ref="var[123]"
./nameref18.sub: line 54: declare: var[123]: not found
declare -a var=([123]="X")
+3 -10
View File
@@ -115,13 +115,6 @@ declare -n v=var
echo ${!x//c/x}
echo ${v//c/x}
${THIS_SH} ./nameref1.sub
${THIS_SH} ./nameref2.sub
${THIS_SH} ./nameref3.sub
${THIS_SH} ./nameref4.sub
${THIS_SH} ./nameref5.sub
${THIS_SH} ./nameref6.sub
${THIS_SH} ./nameref7.sub
${THIS_SH} ./nameref8.sub
${THIS_SH} ./nameref9.sub
${THIS_SH} ./nameref10.sub
for testfile in ./nameref[0-9].sub ./nameref[1-9][0-9].sub ; do
${THIS_SH} "$testfile"
done
+41
View File
@@ -0,0 +1,41 @@
r=/; declare -n r ; unset r
declare -n r=/ ; unset -n r
declare -n r; r=/ ; unset -n r
declare -n r; declare r=/ ; unset -n r
declare -n r; for r in /; do :; done ; unset -n r
declare -n r; select r in /; do :; done <<< 1; echo x; echo $r ; unset -n r
declare -n r; ((r=0)) ; unset -n r
((r=0)); declare -n r ; unset -n r
r=/ declare -n r ; unset -n r
f() { declare -n r; }; r=/ f ; unset r
f() { echo $r; }; declare -n r; r=/ f ; unset -n r
declare -n r; : ${r:=/} ; unset -n r
declare -n r; exec {r}>/dev/null ; unset -n r
declare -n r; coproc r { :; }; echo $r ; unset r ; wait
declare -r RO=x; r=$RO; declare -n r; x=y; declare -n RO; RO=z; declare -p RO; echo "$RO"
s=/; declare -n r=s; declare -n s; echo $r ; unset -n r ; unset -n s
declare -n r=s; declare -n s; s=/ ; unset -n r; unset -n s
declare -n r; getopts x r -h ; unset r; unset -n r
declare -n r; mapfile r < /dev/null ; declare -p r; unset r ; unset -n r
mapfile r < /dev/null; declare -n r ; unset r ; unset -n r
declare -n r; printf -v r / ; unset -n r
declare -n r; r="" ; unset -n r
declare -n r="" ; unset -n r
declare -n r; : ${r=} ; unset -n r
declare -n r; printf -v r '' ; unset -n r
r=""; declare -n r ; unset -n r
export r
# coproc tests, since coproc sets and unsets variables
declare -r ROVAR=42
declare -p ROVAR; coproc ROVAR { :; }; wait; declare -p ROVAR
echo ${@:0}; coproc @ { :; }; wait ; echo ${@:0}
declare -n ref=x; coproc ref { :; }; wait ; declare -p ref
unset -n ref ; unset ref
declare -r RO RO_PID; coproc RO { :; }; declare -p RO_PID; wait; declare -p RO RO_PID
declare -r RO2=a; declare -n ref_PID=RO2; coproc ref { :; }; wait; declare -p RO2
+100
View File
@@ -0,0 +1,100 @@
declare -n r
declare -n r
unset -n r
r=foo
declare -n r=/
r=%
declare -n r
unset r
declare -n r
r=^
declare -p r
unset -n r
declare -n foo
declare -a foo
declare -p foo
foo[0]=7
declare -p foo
unset foo
declare -n x
declare x=42
declare -p x
declare -n -r RO=foo
declare -p RO
unset -n r; unset r
# the details of this may change; currently we put namerefs and values into
# the tempenv if the nameref value is an invalid variable name
f() { echo $r; }
declare -n r
r=/ ${THIS_SH} < /dev/null
r=/ f
unset -f f
# the details of this may change; this will tell me when they do
declare -n foo ; declare -i foo=7*6 ; declare -p foo
unset -n foo
declare -n foo ; declare -i foo ; foo=7*6 ; declare -p foo
# used to be buggy
f()
{
unset var
declare -n ref=var
declare -n ref
declare -p ref
}
f
unset -f f
f()
{
local var
declare -n ref=var
declare -n ref
declare -p ref
}
f
unset ref; unset -n ref
unset var
var=foo
typeset -n ref=var[0]
readonly ref
typeset -p var
var2=foo
typeset -n ref2=var2
readonly ref2
typeset -p var2
unset var
unset -n ref ref2
unset var; typeset -n ref=var
ref[0]=foo
typeset -p ref var
unset -n ref
unset var; typeset -n ref
ref[0]=foo
typeset -p ref
unset -n ref
ref=global
f() { declare -n ref=var; ref[0]=foo1; }; f
f() { declare -n ref=var; ref[0]=foo2; }; f
declare -p ref var
declare -p global
+102
View File
@@ -0,0 +1,102 @@
declare -nt r=a
f()
{
declare a
declare -n r=a
declare -p a r
}
f
unset -f f
f()
{
declare a
declare -n r
r=a
declare -p a r
}
f
echo $?
unset -f f
P=12345
function foo
{
typeset -n r
typeset -n r=P
typeset -p r
}
foo
unset P foo
ref=outside
f()
{
unset var
declare -n ref=var
declare -n ref;
declare -p ref;
}
f
unset ref foo
typeset -n r=a
f()
{
typeset a
typeset -n r
typeset -n r
r=a
typeset -p a r
}
f
echo $?
unset -n r
unset -f f
function foo
{
typeset -n r
typeset -n r
typeset -p r
}
foo
unset -f foo
function foo
{
typeset r
typeset -n r
typeset -p r
}
foo
unset -f foo
foo()
{
typeset -n foo
typeset foo=12345
typeset -p foo
}
foo
unset -f foo
foo()
{
typeset -n foo
typeset -n foo=12345
typeset -p foo
}
foo
unset -f foo
+43
View File
@@ -0,0 +1,43 @@
# exporting namerefs and putting namerefs in temp env post bash-4.3
typeset -nx ref=var;
typeset -p ref
var=foo; str=''
printenv ref # var
ref+=$str printenv ref # var
ref+="$str" printenv ref # var
ref=$ref$str printenv ref # var
export ref # follows nameref and exports var
printenv var # foo
ref+=$str printenv var # foo
ref+="$str" printenv var # foo
ref=$ref$str printenv var # foo
# none of these should change ref; should follow the nameref and export var
unset var; unset -n ref; typeset -n ref=var
echo before
typeset -p ref var
echo first
ref=xxx typeset -p ref var
echo invalid
var= ref=5 typeset -p ref var
echo after
typeset -p ref var
# ref isn't exported, so none of the printenvs should print anything
unset var ; unset -n ref
typeset -n ref=var;
typeset -p ref
var=foo; str=''
printenv ref
ref+=$str printenv ref
ref+="$str" printenv ref
ref=$ref$str printenv ref
+88
View File
@@ -0,0 +1,88 @@
f() { local -n a=$1; a=X; }
a=(0); f 'a[0]'
while [[ -v a ]]; do declare -p a; unset a; done
a=(0); f 'a'
while [[ -v a ]]; do declare -p a; unset a; done
b=(0); f 'b[0]'
while [[ -v a ]]; do typeset -p a; unset a; done
typeset -p b
b=(0); f 'a[0]'
while [[ -v a ]]; do typeset -p a; unset a; done
typeset -p b
add_X_echo()
{
typeset -n ref=$1
ref+=X
echo inside $ref
}
ref=
add_X_echo ref
echo outside "$ref"
unset ref
typeset -n ref=ref
typeset -n ref=re ref+=f
typeset -p ref
ref=4
typeset -p ref re
export ref
printenv ref
printenv re
unset ref ; unset -n ref
unset foo; unset -n foo
typeset -n foo=var[@]
typeset -p foo
typeset -n ref=var ref+=[@]
typeset -p ref
ref=42
typeset -n bar
bar=var[@]
typeset -p bar
bar=7
unset a b
unset -n a b
typeset -n a=b b
b=a[1]
typeset -p a b
a=foo
typeset -p a b
unset a
typeset -n a=b
declare a=foo
typeset -p a b
unset n v
unset -n n v
v=(0 1)
typeset -n n=v
unset n[0]
typeset -p n v
unset -n n
v=(0 1)
typeset -n n=v
unset -n n
typeset -p n v
v=(0 1)
declare -n n=v[1]
unset n
declare -p n v
+44
View File
@@ -0,0 +1,44 @@
# post-bash-4.3 changes for more ksh93 compatibility when following nameref
# chains and using typeset/declare -n to operate on nameref variables rather
# than the variables they reference
# don't follow nameref chain when using declare -n and at the global scope
unset -n r1 r2
typeset -n r1=r2
typeset -n r2=x
typeset -n r1=y
typeset -p r1 r2 x y
# same behavior when in a shell function
foo()
{
typeset -n r1=r2
typeset -n r2=x
typeset -n r1=y
typeset -p r1 r2 x y
}
unset -n r1 r2
foo
unset -f foo
# same behavior when namerefs aren't chained
unset -n r1 r2
typeset -n r1=z
typeset -n r2=x
typeset -n r1=y
typeset -p r1 r2 x y
# same behavior when referenced variables have values
unset -n r1 r2
x=one
y=two
typeset -n r1=r2
typeset -n r2=x
typeset -n r1=y
typeset -p r1 r2 x y
+103
View File
@@ -0,0 +1,103 @@
# test behavior of readonly namerefs and namerefs referencing readonly variables
# readonly nameref variable referencing read-write global variable
bar=one
declare -rn foo0=bar
unset foo0 # unsets bar
declare -p bar
unset -n foo0 # cannot unset
declare -p foo0
declare +r foo0 # modifies bar
declare -p foo0 bar
declare +r -n foo0 # error
declare +n foo0 # error
unset bar
# readonly nameref variable without a value
typeset -n foo1
typeset -r foo1
typeset -p foo1
typeset foo1=bar # error
typeset +r foo1 # no-op, follows nameref chain to nothing
typeset -p foo1
# nameref pointing to read-only global variable
foo2=bar
typeset -n foo2
typeset -r foo2 # changes bar
typeset -p foo2 bar
foo2=bar # error?
typeset +r foo2 # attempts to change bar, error
typeset -p foo2 bar # nameref unchanged
# read-only nameref pointing to read-only global variable
bar3=three
declare -rn foo3=bar3
unset foo3 # unsets bar3
bar3=three
declare -p bar3
unset -n foo3 # cannot unset
readonly bar3
declare +r foo3 # error attempting to reference bar3
declare -p foo3 bar3
declare +r -n foo3 # error
# readonly nameref pointing to read-write local -- can we remove nameref attr?
func()
{
typeset bar4=four
# readonly nameref
typeset -n -r foo4=bar4
typeset -p foo4 bar4
typeset +n foo4
typeset -p foo4
}
func
unset -f func
# readonly nameref pointing to read-write global -- can we remove nameref attr?
bar4=four
foo4=bar4
# readonly nameref
typeset -n foo4
typeset -r -n foo4
typeset -p foo4 bar4
typeset +n foo4
typeset -p foo4
bar4=four
: ${foo4=bar4}
typeset -p foo4 bar4
# readonly local nameref without a value -- can we remove nameref attribute?
func()
{
declare -r -n foo5
declare -p foo5
declare +n foo5
declare -p foo5
}
func
unset -f func
# readonly global nameref without a value -- can we remove nameref attribute?
declare -n foo5
declare -r -n foo5
declare -p foo5
declare +n foo5
declare -p foo5
+54
View File
@@ -0,0 +1,54 @@
declare -n ref=XXX[0]
mapfile ref <<< $'1\n2'
declare -p XXX[0]
unset -n ref
declare -n ref=XXX[0]
declare -A ref
ref[foo]=bar
declare -p XXX[0]
unset -n ref
unset XXX
typeset -n ref=XXX[0]
typeset ref=4
typeset -p ref XXX
unset -n ref
unset XXX
declare -n ref=XXX[0]
ref+=([2]=x)
declare -p ref XXX[0]
unset -n ref
declare -n ref=XXX[0]
read -a ref <<< "A B C"
declare -p XXX[0]
unset -n ref
declare -n ref=XXX[0]
unset ref
ref=()
declare -p ref
coproc ref { :; }; declare -p ${!ref}
wait
unset -n ref
declare -n ref=var[123]
unset ref
declare ref=
declare -p ref ${!ref} var
unset ref
declare ref+=
declare -p ref ${!ref} var
declare +t ref
ref=X
declare -p ref ${!ref} var
+5
View File
@@ -19,8 +19,13 @@ echo $?
echo $?
# pipe
if [ -e /dev/stdin ]; then
echo "echo three - OK" | . /dev/stdin
echo $?
else
# no /dev/stdin, just fake it
echo "three - OK" ; echo 0
fi
# FIFO
mkfifo $TMPDIR/fifo-$$