mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-07-13 15:10:49 +02:00
bash-4.4 beta2 release
This commit is contained in:
+1
-1
@@ -1,5 +1,5 @@
|
||||
THIS=alias2
|
||||
FN=$THIS.script
|
||||
FN=$TMPDIR/$THIS.script
|
||||
|
||||
cat > $FN <<'EOF'
|
||||
#
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -46,3 +46,4 @@ echo ${foo:-$(echo a{b,c})} >/dev/null
|
||||
|
||||
${THIS_SH} ./comsub1.sub
|
||||
${THIS_SH} ./comsub2.sub
|
||||
${THIS_SH} ./comsub3.sub
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -372,4 +372,6 @@ ${THIS_SH} ./extglob1a.sub
|
||||
|
||||
${THIS_SH} ./extglob3.sub
|
||||
|
||||
${THIS_SH} ./extglob4.sub
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
LANG=en_US.UTF-8
|
||||
|
||||
shopt -s extglob
|
||||
a="aaaäöü"
|
||||
|
||||
echo "${a}" "${a//?aa}" "${a//\aaa}"
|
||||
exit 0
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -39,3 +39,5 @@ ${THIS_SH} ./getopts7.sub -a
|
||||
|
||||
${THIS_SH} ./getopts8.sub
|
||||
${THIS_SH} ./getopts9.sub
|
||||
|
||||
${THIS_SH} ./getopts10.sub
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
!
|
||||
!
|
||||
!
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -56,3 +56,6 @@ set +o pipefail
|
||||
|
||||
${THIS_SH} ./lastpipe1.sub
|
||||
echo lastpipe1.sub returns $?
|
||||
|
||||
${THIS_SH} ./lastpipe2.sub
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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-$$
|
||||
|
||||
Reference in New Issue
Block a user