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