mirror of https://github.com/n-hys/bash.git
226 lines
4.2 KiB
Bash
226 lines
4.2 KiB
Bash
#
|
|
# varenv.sh
|
|
#
|
|
# Test the behavior of the shell with respect to variable and environment
|
|
# assignments
|
|
#
|
|
expect()
|
|
{
|
|
echo expect "$@"
|
|
}
|
|
|
|
a=1
|
|
b=2
|
|
c=3
|
|
d=4
|
|
e=5
|
|
f=6 g=7 h=8
|
|
|
|
a=3 b=4 $CHMOD $MODE $FN
|
|
|
|
# This should echo "3 4" according to Posix.2
|
|
expect "3 4"
|
|
echo $a $b
|
|
|
|
set -k
|
|
|
|
# Assignment statements made when no words are left affect the shell's
|
|
# environment
|
|
a=5 b=6 $CHMOD c=7 $MODE d=8 $FN e=9
|
|
|
|
expect "5 6 7 8 9"
|
|
echo $a $b $c $d $e
|
|
|
|
$CHMOD f=7 $MODE g=8 $FN h=9
|
|
expect "7 8 9"
|
|
echo $f $g $h
|
|
|
|
set +k
|
|
|
|
# The temporary environment does not affect variable expansion, only the
|
|
# environment given to the command
|
|
|
|
export HOME=/usr/chet
|
|
expect $HOME
|
|
echo $HOME
|
|
|
|
expect $HOME
|
|
HOME=/a/b/c /bin/echo $HOME
|
|
|
|
expect $HOME
|
|
echo $HOME
|
|
|
|
# This should echo /a/b/c
|
|
expect /a/b/c
|
|
HOME=/a/b/c printenv HOME
|
|
|
|
set -k
|
|
|
|
# This should echo $HOME 9, NOT /a/b/c 9
|
|
|
|
expect "$HOME"
|
|
HOME=/a/b/c /bin/echo $HOME c=9
|
|
expect "$HOME 7"
|
|
echo $HOME $c
|
|
|
|
# I claim the next two echo calls should give identical output.
|
|
# ksh agrees, the System V.3 sh does not
|
|
|
|
expect "/a/b/c 9 /a/b/c"
|
|
HOME=/a/b/c $ECHO a=$HOME c=9
|
|
echo $HOME $c $a
|
|
|
|
expect "/a/b/c 9 /a/b/c"
|
|
HOME=/a/b/c a=$HOME c=9
|
|
echo $HOME $c $a
|
|
set +k
|
|
|
|
# How do assignment statements affect subsequent assignments on the same
|
|
# line?
|
|
expect "/a/b/c /a/b/c"
|
|
HOME=/a/b/c a=$HOME
|
|
echo $HOME $a
|
|
|
|
# The system V.3 sh does this wrong; the last echo should output "1 1",
|
|
# but the system V.3 sh has it output "2 2". Posix.2 says the assignment
|
|
# statements are processed left-to-right. bash and ksh output the right
|
|
# thing
|
|
c=1
|
|
d=2
|
|
expect "1 2"
|
|
echo $c $d
|
|
d=$c c=$d
|
|
expect "1 1"
|
|
echo $c $d
|
|
|
|
# just for completeness
|
|
unset d c
|
|
expect unset
|
|
echo ${d-unset}
|
|
|
|
# no output
|
|
export a
|
|
a=bcde
|
|
export a
|
|
/bin/true 2>/dev/null
|
|
|
|
func()
|
|
{
|
|
local YYZ
|
|
|
|
YYZ="song by rush"
|
|
echo $YYZ
|
|
echo $A
|
|
}
|
|
|
|
YYZ="toronto airport"
|
|
A="AVAR"
|
|
echo $YYZ
|
|
echo $A
|
|
A=BVAR func
|
|
echo $YYZ
|
|
echo $A
|
|
|
|
export A
|
|
# Make sure expansion doesn't use assignment statements preceding a builtin
|
|
A=ZVAR echo $A
|
|
|
|
XPATH=/bin:/usr/bin:/usr/local/bin:.
|
|
func2()
|
|
{
|
|
local z=yy
|
|
local -a avar=( ${XPATH//: } )
|
|
echo ${avar[@]}
|
|
local
|
|
}
|
|
|
|
avar=42
|
|
echo $avar
|
|
func2
|
|
echo $avar
|
|
|
|
# try to set an attribute for an unset variable; make sure it persists
|
|
# when the variable is assigned a value
|
|
declare -i ivar
|
|
|
|
ivar=10
|
|
|
|
declare -p ivar
|
|
unset ivar
|
|
|
|
# export an unset variable, make sure it is not suddenly set, but make
|
|
# sure the export attribute persists when the variable is assigned a
|
|
# value
|
|
export ivar
|
|
echo ${ivar-unset}
|
|
|
|
ivar=42
|
|
declare -p ivar
|
|
|
|
# make sure set [-+]o ignoreeof and $IGNOREEOF are reflected
|
|
unset IGNOREEOF
|
|
set +o ignoreeof
|
|
set -o ignoreeof
|
|
if [ "$IGNOREEOF" -ne 10 ]; then
|
|
echo "./varenv.sh: set -o ignoreeof is not reflected in IGNOREEOF" >&2
|
|
fi
|
|
unset IGNOREEOF
|
|
set +o ignoreeof
|
|
|
|
# older versions of bash used to not reset RANDOM in subshells correctly
|
|
[[ $RANDOM -eq $(echo $RANDOM) ]] && echo "RANDOM: problem with subshells"
|
|
|
|
# make sure that shopt -o is reflected in $SHELLOPTS
|
|
# first, get rid of things that might be set automatically via shell
|
|
# variables
|
|
set +o posix
|
|
set +o ignoreeof
|
|
set +o monitor
|
|
echo $-
|
|
echo ${SHELLOPTS}
|
|
shopt -so physical
|
|
echo $-
|
|
echo ${SHELLOPTS}
|
|
|
|
# and make sure it is readonly
|
|
readonly -p | grep SHELLOPTS
|
|
|
|
# This was an error in bash versions prior to bash-2.04. The `set -a'
|
|
# should cause the assignment statement that's an argument to typeset
|
|
# to create an exported variable
|
|
unset FOOFOO
|
|
FOOFOO=bar
|
|
set -a
|
|
typeset FOOFOO=abcde
|
|
|
|
printenv FOOFOO
|
|
|
|
# test out export behavior of variable assignments preceding builtins and
|
|
# functions
|
|
$THIS_SH ./varenv1.sub
|
|
|
|
# more tests; bugs in bash up to version 2.05a
|
|
$THIS_SH ./varenv2.sub
|
|
|
|
# more tests; bugs in bash IFS scoping up through version 4.2
|
|
$THIS_SH ./varenv3.sub
|
|
|
|
# scoping problems with declare -g through bash-4.2
|
|
${THIS_SH} ./varenv4.sub
|
|
|
|
# more scoping and declaration problems with -g and arrays through bash-4.2
|
|
${THIS_SH} ./varenv5.sub
|
|
|
|
# variable scoping in the presence of nameref
|
|
${THIS_SH} ./varenv6.sub
|
|
|
|
# variable declaration problems with arrays and readonly local variables
|
|
${THIS_SH} ./varenv7.sub
|
|
|
|
# variable visibility problems with process substitution subshells in
|
|
# redirections
|
|
${THIS_SH} ./varenv8.sub
|
|
|
|
# make sure variable scoping is done right
|
|
tt() { typeset a=b;echo a=$a; };a=z;echo a=$a;tt;echo a=$a
|