xref: /onnv-gate/usr/src/lib/libshell/common/tests/heredoc.sh (revision 12068:08a39a083754)
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