Date: Sat, 21 Mar 1998 13:40:02 -0800 (PST) From: Tor Egge <Tor.Egge@idi.ntnu.no> To: freebsd-bugs Subject: Re: bin/6087: sh doesn't work properly on certain configuration scripts Message-ID: <199803212140.NAA06380@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/6087; it has been noted by GNATS.
From: Tor Egge <Tor.Egge@idi.ntnu.no>
To: giffunip@asme.org
Cc: freebsd-gnats-submit@FreeBSD.ORG
Subject: Re: bin/6087: sh doesn't work properly on certain configuration scripts
Date: Sat, 21 Mar 1998 22:33:54 +0100
----Next_Part(Sat_Mar_21_22:32:09_1998)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
ash removes quoting information during parsing, thus the evaluation
pass is not able to differentiate between
""$foobar
and
$foobar
This breaks proper handling of word splitting. When $foobar expands
to a single space, bash misbehaves too, for a slightly different
reason.
bash and ksh93 seems to perform word splitting differently:
( IFS="beh"; foobar="ghi"; echo "abc"abc$foobar "def"def )
bash gives abca cg i defdef
ksh93 gives abcabcg i defdef
bash seems to follow POSIX 1003.2 draft 11.2 while ksh93 seems to
follow spec1170 for this example.
I'm using some patches that changes the word splitting handling for
ash in an attempt to follow spec 1170 while not being bug compatible
with ksh93. Thus your test script does not complain when run on
my development system.
A slightly bigger test script is appended here. It reveals some
of the other anomalies in bash and ksh93.
- Tor Egge
----Next_Part(Sat_Mar_21_22:32:09_1998)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: "sh-ifs-test"
#!/bin/sh
echo "Tests of IFS handling and word splitting, v1.0 running"
exec 2>&1
if [ `echo -n | wc -l` = 0 ]
then
echo1="-n"
echo2="--> "
echo3=""
else
echo1=""
echo2="--> \c"
echo3="\c"
fi
echo '[OIFS="$IFS"]'
OIFS="$IFS"
# echo '[var="*"]'
# var="*"
# echo $echo1 '[echo $var] ' "$echo2"
# echo $var
# echo $echo1 '[echo "$var"] ' "$echo2"
# echo "$var"
showargs() {
XIFS="$IFS"
IFS="
"
for arg in "$@"
do
echo $echo1 "'$arg' $echo3"
done
echo
IFS="$XIFS"
}
echo '[set abc "def ghi" jkl]'
set abc "def ghi" jkl
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo 'set "" abc "def ghi" "" jkl ""'
set "" abc "def ghi" "" jkl ""
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo '[IFS=""]'
IFS=""
echo 'set "" abc "def ghi" "" jkl ""'
set "" abc "def ghi" "" jkl ""
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo '[unset IFS]'
unset IFS
echo 'set "" abc "def ghi" "" jkl ""'
set "" abc "def ghi" "" jkl ""
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo '[IFS=":"]'
IFS=":"
echo 'set "" abc "def ghi" "" jkl ""'
set "" abc "def ghi" "" jkl ""
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo '[IFS=":$OIFS"]'
IFS=":$OIFS"
echo 'set "" abc "def ghi" "" jkl ""'
set "" abc "def ghi" "" jkl ""
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo '[IFS="$OIFS:"]'
IFS="$OIFS:"
echo 'set "" abc "def ghi" " : " jkl ""'
set "" abc "def ghi" " : " jkl ""
echo $echo1 '[showargs $*] ' "$echo2"
showargs $*
echo $echo1 '[showargs "$*"] ' "$echo2"
showargs "$*"
echo $echo1 '[showargs $@] ' "$echo2"
showargs $@
echo $echo1 '[showargs "$@"] ' "$echo2"
showargs "$@"
echo $echo1 '[showargs "xx$@yy"] ' "$echo2"
showargs "xx$@yy"
echo $echo1 '[showargs "$@$@"] ' "$echo2"
showargs "$@$@"
echo $echo1 '[showargs "" ab "" cd ef] ' "$echo2"
showargs "" ab "" cd ef
echo '[A=""]'
A=""
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo $echo1 '[showargs ${A}""] ' "$echo2"
showargs ${A}""
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ""${A}] ' "$echo2"
showargs ""${A}
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo '[A=" "]'
A=" "
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo $echo1 '[showargs ${A}""] ' "$echo2"
showargs ${A}""
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ""${A}] ' "$echo2"
showargs ""${A}
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo '[A=" "]'
A=" "
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo $echo1 '[showargs ${A}""] ' "$echo2"
showargs ${A}""
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ""${A}] ' "$echo2"
showargs ""${A}
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo '[A=":"]'
A=":"
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo $echo1 '[showargs ${A}""] ' "$echo2"
showargs ${A}""
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ""${A}] ' "$echo2"
showargs ""${A}
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo '[A="X:"]'
A="X:"
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo '[A="X :"]'
A="X :"
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo '[A="X : "]'
A="X : "
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo '[A="X: "]'
A="X: "
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo '[A="::"]'
A="::"
echo $echo1 '[showargs ${A}] ' "$echo2"
showargs ${A}
echo $echo1 '[showargs ${A}""] ' "$echo2"
showargs ${A}""
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ""${A}] ' "$echo2"
showargs ""${A}
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo '[A="ab:c:"]'
A="ab:c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="ab: c:"]'
A="ab: c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="ab : c:"]'
A="ab : c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="ab c:"]'
A="ab c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a b:c:"]'
A="a b:c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a:b:c:"]'
A="a:b:c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a :b:c:"]'
A="a :b:c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a : b:c:"]'
A="a : b:c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a: b:c:"]'
A="a: b:c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a: b c:"]'
A="a: b c:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A="a b c d e"]'
A="a b c d e"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo $echo1 '[showargs "$A"] ' "$echo2"
showargs "$A"
echo '[A=" a b c d e "]'
A=" a b c d e "
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo '[A=":a b c d :: e:"]'
A=":a b c d :: e:"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo $echo1 '[echo $A] ' "$echo2"
echo $A
echo '[A=":a b c d :: f::"]'
A=":a b c d :: f::"
echo $echo1 '[showargs $A] ' "$echo2"
showargs $A
echo $echo1 '[echo $A] ' "$echo2"
echo $A
echo '[A=":"]'
A=":"
echo $echo1 '[showargs X${A}Y${A}X] ' "$echo2"
showargs X${A}Y${A}X
echo $echo1 '[showargs X${A}${A}X] ' "$echo2"
showargs X${A}${A}X
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo $echo1 '[showargs X${A}${A}] ' "$echo2"
showargs X${A}${A}
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ${A}${A}X] ' "$echo2"
showargs ${A}${A}X
echo '[A="::"]'
A="::"
echo $echo1 '[showargs X${A}Y${A}X] ' "$echo2"
showargs X${A}Y${A}X
echo $echo1 '[showargs X${A}${A}X] ' "$echo2"
showargs X${A}${A}X
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo $echo1 '[showargs X${A}${A}] ' "$echo2"
showargs X${A}${A}
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ${A}${A}X] ' "$echo2"
showargs ${A}${A}X
echo '[A=" ::"]'
A=" ::"
echo $echo1 '[showargs X${A}Y${A}X] ' "$echo2"
showargs X${A}Y${A}X
echo $echo1 '[showargs X${A}${A}X] ' "$echo2"
showargs X${A}${A}X
echo $echo1 '[showargs X${A}] ' "$echo2"
showargs X${A}
echo $echo1 '[showargs X${A}${A}] ' "$echo2"
showargs X${A}${A}
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[showargs ${A}${A}X] ' "$echo2"
showargs ${A}${A}X
echo '[A="ab "]'
A="ab "
echo 'B=" cde"]'
B=" cde"
echo $echo1 '[showargs $A$B] ' "$echo2"
showargs $A$B
echo '[A="ab :"]'
A="ab :"
echo '[B=" cde"]'
B=" cde"
echo $echo1 '[showargs $A$B] ' "$echo2"
showargs $A$B
echo $echo1 '[showargs ${A}X] ' "$echo2"
showargs ${A}X
echo $echo1 '[echo "a:b:c"] ' "$echo2"
echo "a:b:c"
echo $echo1 '[echo "a:b\:c"] ' "$echo2"
echo "a:b\:c"
echo $echo1 '[echo a:b:c] ' "$echo2"
echo a:b:c
echo $echo1 '[echo a:b\:c] ' "$echo2"
echo a:b\:c
echo $echo1 '[echo a:b:c":d:e:f"] ' "$echo2"
echo a:b:c":d:e:f"
echo $echo1 '[echo a:b\:c":d:e\:f"] ' "$echo2"
echo a:b\:c":d:e\:f"
echo '[var="val:val2\:val3"]'
var="val:val2\:val3"
echo '[xvar=":val:val2\:val3"]'
xvar=":val:val2\:val3"
echo $echo1 '[echo $novar:b:c] ' "$echo2"
echo $novar:b:c
echo $echo1 '[echo $xvar] ' "$echo2"
echo $xvar
echo $echo1 '[echo "$var:b:c"] ' "$echo2"
echo "$var:b:c"
echo $echo1 '[echo "$var:b\:c"] ' "$echo2"
echo "$var:b\:c"
echo $echo1 '[echo $var:b:c] ' "$echo2"
echo $var:b:c
echo $echo1 '[echo $var:b\:c] ' "$echo2"
echo $var:b\:c
echo $echo1 '[echo $var:b:c":$var:e:f"] ' "$echo2"
echo $var:b:c":$var:e:f"
echo $echo1 '[echo $var:b\:c":$var:e\:f"]' "$echo2"
echo $var:b\:c":$var:e\:f"
echo $echo1 '[echo $var:`echo '\''h:i'\''`] ' "$echo2"
echo $var:`echo 'h:i'`
echo $echo1 '[echo $var:"`echo '\''h:i'\''`"] ' "$echo2"
echo $var:"`echo 'h:i'`"
echo '[IFS="${OIFS}a"]'
IFS="${OIFS}a"
echo '[HOME="harmless"]'
HOME="/harmless"
echo $echo1 '[echo ~] ' "$echo2"
echo ~
echo $echo1 '[echo ~/$var] ' "$echo2"
echo ~/$var
echo $echo1 '[echo ~root] ' "$echo2"
echo ~root
echo $echo1 '[echo ~roo'\''t'\''] ' "$echo2"
echo ~roo't'
echo $echo1 '[echo ~roo"t"] ' "$echo2"
echo ~roo"t"
echo $echo1 '[echo ~root\/] ' "$echo2"
echo ~root\/
echo $echo1 '[echo \~root] ' "$echo2"
echo \~root
echo $echo1 '[echo "~"root] ' "$echo2"
echo "~"root
echo $echo1 '[echo var:bad:bad] ' "$echo2"
echo var:bad:bad
echo $echo1 '[echo $var:bad:bad] ' "$echo2"
echo $var:bad:bad
echo $echo1 '[echo $var:bad:"bad"] ' "$echo2"
echo $var:bad:"bad"
echo $echo1 '[echo $var:bad:'\''bad'\''] ' "$echo2"
echo $var:bad:'bad'
if [ ! `echo "$((4+4))"` = 8 ]
then
echo "Extended syntax not supported."
exit 0
fi
echo '[IFS="${OIFS}:"]'
IFS="${OIFS}:"
echo $echo1 '[echo $var:$(echo '\''f:g'\'')] ' "$echo2"
echo $var:$(echo 'f:g')
echo $echo1 '[echo $var:"$(echo '\''f:g'\'')"] ' "$echo2"
echo $var:"$(echo 'f:g')"
echo $echo1 '[echo $var:$((4+4))] ' "$echo2"
echo $var:$((4+4))
echo '[IFS="${OIFS}6"]'
IFS="${OIFS}6"
echo $echo1 '[echo 262144:$((13*13))] ' "$echo2"
echo 262144:$((13*13))
echo $echo1 '[echo 262144":$((13*13))"] ' "$echo2"
echo 262144":$((13*13))"
# No shells seems to support this construct, due to separate passes
# for parsing and evaluation:
# echo "$((4+`echo '4))'`"
# If parsing was performed during evaluation, the result could be
# "$((4+`echo '4))'`" (initial state)
# "$((4+`echo '4))'`" (after tilde expansion)
# "$((4+`echo '4))'`" (after parameter expansion)
# "$((4+4))" (after command substitution)
# "8" (after arithmetic expansion)
# "8" (after field splitting)
# "8" (after pathname expansion)
# 8 (after quote removal)
----Next_Part(Sat_Mar_21_22:32:09_1998)----
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199803212140.NAA06380>
