14887Schin######################################################################## 24887Schin# # 34887Schin# This software is part of the ast package # 4*8462SApril.Chin@Sun.COM# Copyright (c) 1982-2008 AT&T Intellectual Property # 54887Schin# and is licensed under the # 64887Schin# Common Public License, Version 1.0 # 7*8462SApril.Chin@Sun.COM# by AT&T Intellectual Property # 84887Schin# # 94887Schin# A copy of the License is available at # 104887Schin# http://www.opensource.org/licenses/cpl1.0.txt # 114887Schin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 124887Schin# # 134887Schin# Information and Software Systems Research # 144887Schin# AT&T Research # 154887Schin# Florham Park NJ # 164887Schin# # 174887Schin# David Korn <dgk@research.att.com> # 184887Schin# # 194887Schin######################################################################## 204887Schinfunction err_exit 214887Schin{ 224887Schin print -u2 -n "\t" 234887Schin print -u2 -r ${Command}[$1]: "${@:2}" 244887Schin let Errors+=1 254887Schin} 264887Schinalias err_exit='err_exit $LINENO' 274887Schin 284887SchinCommand=${0##*/} 294887Schininteger Errors=0 304887Schinf=/tmp/here1$$ 314887Sching=/tmp/here2$$ 324887Schintrap "rm -f $f $g" EXIT 334887Schincat > $f <<! 344887Schinhello world 354887Schin! 364887Schinif [[ $(<$f) != 'hello world' ]] 374887Schinthen err_exit "'hello world' here doc not working" 384887Schinfi 394887Schincat > $g <<\! 404887Schinhello world 414887Schin! 424887Schincmp $f $g 2> /dev/null || err_exit "'hello world' quoted here doc not working" 434887Schincat > $g <<- ! 444887Schin hello world 454887Schin! 464887Schincmp $f $g 2> /dev/null || err_exit "'hello world' tabbed here doc not working" 474887Schincat > $g <<- \! 484887Schin hello world 494887Schin! 504887Schincmp $f $g 2> /dev/null || err_exit "'hello world' quoted tabbed here doc not working" 514887Schinx=hello 524887Schincat > $g <<! 534887Schin$x world 544887Schin! 554887Schincmp $f $g 2> /dev/null || err_exit "'$x world' here doc not working" 564887Schincat > $g <<! 574887Schin$(print hello) world 584887Schin! 594887Schincmp $f $g 2> /dev/null || err_exit "'$(print hello) world' here doc not working" 604887Schincat > $f <<\!! 614887Schin!@#$%%^^&*()_+~"::~;'`<>?/.,{}[] 624887Schin!! 634887Schinif [[ $(<$f) != '!@#$%%^^&*()_+~"::~;'\''`<>?/.,{}[]' ]] 644887Schinthen err_exit "'hello world' here doc not working" 654887Schinfi 664887Schincat > $g <<!! 674887Schin!@#\$%%^^&*()_+~"::~;'\`<>?/.,{}[] 684887Schin!! 694887Schincmp $f $g 2> /dev/null || err_exit "unquoted here doc not working" 704887Schinexec 3<<! 714887Schin foo 724887Schin! 734887Schinif [[ $(<&3) != ' foo' ]] 744887Schinthen err_exit "leading tabs stripped with <<!" 754887Schinfi 764887Schin$SHELL -c " 774887Schineval `echo 'cat <<x'` "|| err_exit "eval `echo 'cat <<x'` core dumps" 784887Schincat > /dev/null <<EOF # comments should not cause core dumps 794887Schinabc 804887SchinEOF 814887Schincat >$g << : 824887Schin: 834887Schin: 844887Schincmp /dev/null $g 2> /dev/null || err_exit "empty here doc not working" 854887Schinx=$(print $( cat <<HUP 864887Schinhello 874887SchinHUP 884887Schin) 894887Schin) 904887Schinif [[ $x != hello ]] 914887Schinthen err_exit "here doc inside command sub not working" 924887Schinfi 934887Schiny=$(cat <<! 944887Schin${x:+${x}} 954887Schin! 964887Schin) 974887Schinif [[ $y != "${x:+${x}}" ]] 984887Schinthen err_exit '${x:+${x}} not working in here document' 994887Schinfi 1004887Schin$SHELL -c ' 1014887Schinx=0 1024887Schinwhile (( x < 100 )) 1034887Schindo ((x = x+1)) 1044887Schin cat << EOF 1054887SchinEOF 1064887Schindone 1074887Schin' 2> /dev/null || err_exit '100 empty here docs fails' 1084887Schin{ 1094887Schin print 'builtin -d cat 1104887Schin cat <<- EOF' 1114887Schin for ((i=0; i < 100; i++)) 1124887Schin do print XXXXXXXXXXXXXXXXXXXX 1134887Schin done 1144887Schin print ' XXX$(date)XXXX 1154887Schin EOF' 1164887Schin} > $f 1174887Schinchmod +x "$f" 1184887Schin$SHELL "$f" > /dev/null || err_exit "large here-doc with command substitution fails" 1194887Schinx=$(/bin/cat <<! 1204887Schin$0 1214887Schin! 1224887Schin) 1234887Schin[[ "$x" == "$0" ]] || err_exit '$0 not correct inside here documents' 1244887Schin$SHELL -c 'x=$( 1254887Schincat << EOF 1264887SchinEOF)' 2> /dev/null || err_exit 'here-doc cannot be terminated by )' 1274887Schinif [[ $( IFS=:;cat <<-! 1284887Schin $IFS$(print hi)$IFS 1294887Schin !) != :hi: ]] 1304887Schinthen err_exit '$IFS unset by command substitution in here docs' 1314887Schinfi 1324887Schinif x=$($SHELL -c 'cat <<< "hello world"' 2> /dev/null) 1334887Schinthen [[ $x == 'hello world' ]] || err_exit '<<< documents not working' 1344887Schin x=$($SHELL -c 'v="hello world";cat <<< $v' 2> /dev/null) 1354887Schin [[ $x == 'hello world' ]] || err_exit '<<< documents with $x not working' 1364887Schin x=$($SHELL -c 'v="hello world";cat <<< "$v"' 2> /dev/null) 1374887Schin [[ $x == 'hello world' ]] || err_exit '<<< documents with $x not working' 1384887Schinelse err_exit '<<< syntax not supported' 1394887Schinfi 1404887Schinif [[ $(cat << EOF #testing 1414887Schin#abc 1424887Schinabc 1434887SchinEOF) != $'#abc\nabc' ]] 1444887Schinthen err_exit 'comments not preserved in here-documents' 1454887Schinfi 1464887Schincat > "$f" <<- '!!!!' 1474887Schin builtin cat 1484887Schin : << EOF 1494887Schin $PWD 1504887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1514887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1524887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1534887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1544887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1554887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1564887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1574887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1584887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1594887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1604887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1614887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1624887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1634887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1644887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1654887Schin EOF 1664887Schin command exec 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&- 1674887Schin x=abc 1684887Schin cat << EOF 1694887Schin $x 1704887Schin EOF 1714887Schin!!!! 1724887Schinchmod 755 "$f" 1734887Schinif [[ $($SHELL "$f") != abc ]] 1744887Schinthen err_exit 'here document descritor was closed' 1754887Schinfi 1764887Schincat > "$f" <<- '!!!!' 1774887Schin exec 0<&- 1784887Schin foobar() 1794887Schin { 1804887Schin /bin/cat <<- ! 1814887Schin foobar 1824887Schin ! 1834887Schin } 1844887Schin : << EOF 1854887Schin $PWD 1864887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1874887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1884887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1894887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1904887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1914887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1924887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1934887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1944887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1954887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1964887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1974887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1984887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1994887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2004887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2014887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2024887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2034887Schin EOF 2044887Schin print -r -- "$(foobar)" 2054887Schin!!!! 2064887Schinif [[ $($SHELL "$f") != foobar ]] 2074887Schinthen err_exit 'here document with stdin closed failed' 2084887Schinfi 2094887Schinprintf $'cat <<# \\!!!\n\thello\n\t\tworld\n!!!' > $f 2104887Schin[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for quoted here documents" 2114887Schinprintf $'w=world;cat <<# !!!\n\thello\n\t\t$w\n!!!' > $f 2124887Schin[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for non-quoted here documents" 213*8462SApril.Chin@Sun.COM[[ $( $SHELL <<- \++++ 214*8462SApril.Chin@Sun.COM S=( typeset a ) 215*8462SApril.Chin@Sun.COM function S.a.get 216*8462SApril.Chin@Sun.COM { 217*8462SApril.Chin@Sun.COM .sh.value=$__a 218*8462SApril.Chin@Sun.COM } 219*8462SApril.Chin@Sun.COM __a=1234 220*8462SApril.Chin@Sun.COM cat <<-EOF 221*8462SApril.Chin@Sun.COM ${S.a} 222*8462SApril.Chin@Sun.COM EOF 223*8462SApril.Chin@Sun.COM++++ 224*8462SApril.Chin@Sun.COM) == 1234 ]] 2> /dev/null || err_exit 'here document with get discipline failed' 225*8462SApril.Chin@Sun.COM[[ $($SHELL -c 'g(){ print ok;}; cat <<- EOF 226*8462SApril.Chin@Sun.COM ${ g;} 227*8462SApril.Chin@Sun.COM EOF 228*8462SApril.Chin@Sun.COM ' 2> /dev/null) == ok ]] || err_exit '${ command;} not working in heredoc' 2294887Schinexit $((Errors)) 230