14887Schin######################################################################## 24887Schin# # 34887Schin# This software is part of the ast package # 4*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 1982-2010 AT&T Intellectual Property # 54887Schin# and is licensed under the # 64887Schin# Common Public License, Version 1.0 # 78462SApril.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 3010898Sroland.mainz@nrubsig.org 3110898Sroland.mainz@nrubsig.orgtmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3210898Sroland.mainz@nrubsig.orgtrap "cd /; rm -rf $tmp" EXIT 3310898Sroland.mainz@nrubsig.org 3410898Sroland.mainz@nrubsig.orgf=$tmp/here1 3510898Sroland.mainz@nrubsig.orgg=$tmp/here2 364887Schincat > $f <<! 374887Schinhello world 384887Schin! 394887Schinif [[ $(<$f) != 'hello world' ]] 404887Schinthen err_exit "'hello world' here doc not working" 414887Schinfi 424887Schincat > $g <<\! 434887Schinhello world 444887Schin! 454887Schincmp $f $g 2> /dev/null || err_exit "'hello world' quoted here doc not working" 464887Schincat > $g <<- ! 474887Schin hello world 484887Schin! 494887Schincmp $f $g 2> /dev/null || err_exit "'hello world' tabbed here doc not working" 504887Schincat > $g <<- \! 514887Schin hello world 524887Schin! 534887Schincmp $f $g 2> /dev/null || err_exit "'hello world' quoted tabbed here doc not working" 544887Schinx=hello 554887Schincat > $g <<! 564887Schin$x world 574887Schin! 584887Schincmp $f $g 2> /dev/null || err_exit "'$x world' here doc not working" 594887Schincat > $g <<! 604887Schin$(print hello) world 614887Schin! 624887Schincmp $f $g 2> /dev/null || err_exit "'$(print hello) world' here doc not working" 634887Schincat > $f <<\!! 644887Schin!@#$%%^^&*()_+~"::~;'`<>?/.,{}[] 654887Schin!! 664887Schinif [[ $(<$f) != '!@#$%%^^&*()_+~"::~;'\''`<>?/.,{}[]' ]] 674887Schinthen err_exit "'hello world' here doc not working" 684887Schinfi 694887Schincat > $g <<!! 704887Schin!@#\$%%^^&*()_+~"::~;'\`<>?/.,{}[] 714887Schin!! 724887Schincmp $f $g 2> /dev/null || err_exit "unquoted here doc not working" 734887Schinexec 3<<! 744887Schin foo 754887Schin! 764887Schinif [[ $(<&3) != ' foo' ]] 774887Schinthen err_exit "leading tabs stripped with <<!" 784887Schinfi 794887Schin$SHELL -c " 804887Schineval `echo 'cat <<x'` "|| err_exit "eval `echo 'cat <<x'` core dumps" 814887Schincat > /dev/null <<EOF # comments should not cause core dumps 824887Schinabc 834887SchinEOF 844887Schincat >$g << : 854887Schin: 864887Schin: 874887Schincmp /dev/null $g 2> /dev/null || err_exit "empty here doc not working" 884887Schinx=$(print $( cat <<HUP 894887Schinhello 904887SchinHUP 914887Schin) 924887Schin) 934887Schinif [[ $x != hello ]] 944887Schinthen err_exit "here doc inside command sub not working" 954887Schinfi 964887Schiny=$(cat <<! 974887Schin${x:+${x}} 984887Schin! 994887Schin) 1004887Schinif [[ $y != "${x:+${x}}" ]] 1014887Schinthen err_exit '${x:+${x}} not working in here document' 1024887Schinfi 1034887Schin$SHELL -c ' 1044887Schinx=0 1054887Schinwhile (( x < 100 )) 1064887Schindo ((x = x+1)) 1074887Schin cat << EOF 1084887SchinEOF 1094887Schindone 1104887Schin' 2> /dev/null || err_exit '100 empty here docs fails' 1114887Schin{ 1124887Schin print 'builtin -d cat 1134887Schin cat <<- EOF' 1144887Schin for ((i=0; i < 100; i++)) 1154887Schin do print XXXXXXXXXXXXXXXXXXXX 1164887Schin done 1174887Schin print ' XXX$(date)XXXX 1184887Schin EOF' 1194887Schin} > $f 1204887Schinchmod +x "$f" 1214887Schin$SHELL "$f" > /dev/null || err_exit "large here-doc with command substitution fails" 1224887Schinx=$(/bin/cat <<! 1234887Schin$0 1244887Schin! 1254887Schin) 1264887Schin[[ "$x" == "$0" ]] || err_exit '$0 not correct inside here documents' 1274887Schin$SHELL -c 'x=$( 1284887Schincat << EOF 1294887SchinEOF)' 2> /dev/null || err_exit 'here-doc cannot be terminated by )' 1304887Schinif [[ $( IFS=:;cat <<-! 1314887Schin $IFS$(print hi)$IFS 1324887Schin !) != :hi: ]] 1334887Schinthen err_exit '$IFS unset by command substitution in here docs' 1344887Schinfi 1354887Schinif x=$($SHELL -c 'cat <<< "hello world"' 2> /dev/null) 1364887Schinthen [[ $x == 'hello world' ]] || err_exit '<<< documents not working' 1374887Schin x=$($SHELL -c 'v="hello world";cat <<< $v' 2> /dev/null) 1384887Schin [[ $x == 'hello world' ]] || err_exit '<<< documents with $x not working' 1394887Schin x=$($SHELL -c 'v="hello world";cat <<< "$v"' 2> /dev/null) 1404887Schin [[ $x == 'hello world' ]] || err_exit '<<< documents with $x not working' 1414887Schinelse err_exit '<<< syntax not supported' 1424887Schinfi 1434887Schinif [[ $(cat << EOF #testing 1444887Schin#abc 1454887Schinabc 1464887SchinEOF) != $'#abc\nabc' ]] 1474887Schinthen err_exit 'comments not preserved in here-documents' 1484887Schinfi 14910898Sroland.mainz@nrubsig.orgcat > "$f" <<- '!!!!' 1504887Schin builtin cat 1514887Schin : << EOF 1524887Schin $PWD 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 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1664887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1674887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1684887Schin EOF 1694887Schin command exec 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&- 1704887Schin x=abc 1714887Schin cat << EOF 1724887Schin $x 1734887Schin EOF 1744887Schin!!!! 1754887Schinchmod 755 "$f" 1764887Schinif [[ $($SHELL "$f") != abc ]] 1774887Schinthen err_exit 'here document descritor was closed' 1784887Schinfi 17910898Sroland.mainz@nrubsig.orgcat > "$f" <<- '!!!!' 1804887Schin exec 0<&- 1814887Schin foobar() 1824887Schin { 1834887Schin /bin/cat <<- ! 1844887Schin foobar 1854887Schin ! 1864887Schin } 1874887Schin : << EOF 1884887Schin $PWD 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 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2044887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2054887Schin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2064887Schin EOF 2074887Schin print -r -- "$(foobar)" 2084887Schin!!!! 2094887Schinif [[ $($SHELL "$f") != foobar ]] 2104887Schinthen err_exit 'here document with stdin closed failed' 2114887Schinfi 2124887Schinprintf $'cat <<# \\!!!\n\thello\n\t\tworld\n!!!' > $f 21310898Sroland.mainz@nrubsig.org[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for quoted here documents" 2144887Schinprintf $'w=world;cat <<# !!!\n\thello\n\t\t$w\n!!!' > $f 21510898Sroland.mainz@nrubsig.org[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for non-quoted here documents" 2168462SApril.Chin@Sun.COM[[ $( $SHELL <<- \++++ 2178462SApril.Chin@Sun.COM S=( typeset a ) 2188462SApril.Chin@Sun.COM function S.a.get 2198462SApril.Chin@Sun.COM { 2208462SApril.Chin@Sun.COM .sh.value=$__a 2218462SApril.Chin@Sun.COM } 2228462SApril.Chin@Sun.COM __a=1234 2238462SApril.Chin@Sun.COM cat <<-EOF 2248462SApril.Chin@Sun.COM ${S.a} 2258462SApril.Chin@Sun.COM EOF 2268462SApril.Chin@Sun.COM++++ 2278462SApril.Chin@Sun.COM) == 1234 ]] 2> /dev/null || err_exit 'here document with get discipline failed' 2288462SApril.Chin@Sun.COM[[ $($SHELL -c 'g(){ print ok;}; cat <<- EOF 2298462SApril.Chin@Sun.COM ${ g;} 2308462SApril.Chin@Sun.COM EOF 2318462SApril.Chin@Sun.COM ' 2> /dev/null) == ok ]] || err_exit '${ command;} not working in heredoc' 23210898Sroland.mainz@nrubsig.orgscript=$f 23310898Sroland.mainz@nrubsig.org{ 23410898Sroland.mainz@nrubsig.orgfor ((i=0; i < 406; i++)) 23510898Sroland.mainz@nrubsig.orgdo print ': 23456789012345678' 23610898Sroland.mainz@nrubsig.orgdone 23710898Sroland.mainz@nrubsig.orgprint : 123456789123 23810898Sroland.mainz@nrubsig.orgcat <<- \EOF 23910898Sroland.mainz@nrubsig.orgeval "$( 24010898Sroland.mainz@nrubsig.org { cat ; } <<MARKER 24110898Sroland.mainz@nrubsig.org print hello 24210898Sroland.mainz@nrubsig.org MARKER 24310898Sroland.mainz@nrubsig.org)" 24410898Sroland.mainz@nrubsig.orgEOF 24510898Sroland.mainz@nrubsig.org} > $script 24610898Sroland.mainz@nrubsig.orgchmod +x $script 24710898Sroland.mainz@nrubsig.org[[ $($SHELL $script) == hello ]] 2> /dev/null || err_exit 'heredoc embeded in command substitution fails at buffer boundary' 24810898Sroland.mainz@nrubsig.org 24910898Sroland.mainz@nrubsig.orggot=$( cat << EOF 25010898Sroland.mainz@nrubsig.org\ 25110898Sroland.mainz@nrubsig.orgabc 25210898Sroland.mainz@nrubsig.orgEOF) 25310898Sroland.mainz@nrubsig.org[[ $got == abc ]] || err_exit 'line continuation at start of buffer not working' 25410898Sroland.mainz@nrubsig.org 2554887Schinexit $((Errors)) 256