xref: /onnv-gate/usr/src/lib/libshell/common/tests/heredoc.sh (revision 4887:feebf9260c2e)
1*4887Schin########################################################################
2*4887Schin#                                                                      #
3*4887Schin#               This software is part of the ast package               #
4*4887Schin#           Copyright (c) 1982-2007 AT&T Knowledge Ventures            #
5*4887Schin#                      and is licensed under the                       #
6*4887Schin#                  Common Public License, Version 1.0                  #
7*4887Schin#                      by AT&T Knowledge Ventures                      #
8*4887Schin#                                                                      #
9*4887Schin#                A copy of the License is available at                 #
10*4887Schin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11*4887Schin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12*4887Schin#                                                                      #
13*4887Schin#              Information and Software Systems Research               #
14*4887Schin#                            AT&T Research                             #
15*4887Schin#                           Florham Park NJ                            #
16*4887Schin#                                                                      #
17*4887Schin#                  David Korn <dgk@research.att.com>                   #
18*4887Schin#                                                                      #
19*4887Schin########################################################################
20*4887Schinfunction err_exit
21*4887Schin{
22*4887Schin	print -u2 -n "\t"
23*4887Schin	print -u2 -r ${Command}[$1]: "${@:2}"
24*4887Schin	let Errors+=1
25*4887Schin}
26*4887Schinalias err_exit='err_exit $LINENO'
27*4887Schin
28*4887SchinCommand=${0##*/}
29*4887Schininteger Errors=0
30*4887Schinf=/tmp/here1$$
31*4887Sching=/tmp/here2$$
32*4887Schintrap "rm -f $f $g" EXIT
33*4887Schincat > $f <<!
34*4887Schinhello world
35*4887Schin!
36*4887Schinif	[[ $(<$f) != 'hello world' ]]
37*4887Schinthen	err_exit "'hello world' here doc not working"
38*4887Schinfi
39*4887Schincat > $g <<\!
40*4887Schinhello world
41*4887Schin!
42*4887Schincmp $f $g 2> /dev/null || err_exit "'hello world' quoted here doc not working"
43*4887Schincat > $g <<- !
44*4887Schin	hello world
45*4887Schin!
46*4887Schincmp $f $g 2> /dev/null || err_exit "'hello world' tabbed here doc not working"
47*4887Schincat > $g <<- \!
48*4887Schin	hello world
49*4887Schin!
50*4887Schincmp $f $g 2> /dev/null || err_exit "'hello world' quoted tabbed here doc not working"
51*4887Schinx=hello
52*4887Schincat > $g <<!
53*4887Schin$x world
54*4887Schin!
55*4887Schincmp $f $g 2> /dev/null || err_exit "'$x world' here doc not working"
56*4887Schincat > $g <<!
57*4887Schin$(print hello) world
58*4887Schin!
59*4887Schincmp $f $g 2> /dev/null || err_exit "'$(print hello) world' here doc not working"
60*4887Schincat > $f <<\!!
61*4887Schin!@#$%%^^&*()_+~"::~;'`<>?/.,{}[]
62*4887Schin!!
63*4887Schinif	[[ $(<$f) != '!@#$%%^^&*()_+~"::~;'\''`<>?/.,{}[]' ]]
64*4887Schinthen	err_exit "'hello world' here doc not working"
65*4887Schinfi
66*4887Schincat > $g <<!!
67*4887Schin!@#\$%%^^&*()_+~"::~;'\`<>?/.,{}[]
68*4887Schin!!
69*4887Schincmp $f $g 2> /dev/null || err_exit "unquoted here doc not working"
70*4887Schinexec 3<<!
71*4887Schin	foo
72*4887Schin!
73*4887Schinif	[[ $(<&3) != '	foo' ]]
74*4887Schinthen	err_exit "leading tabs stripped with <<!"
75*4887Schinfi
76*4887Schin$SHELL -c "
77*4887Schineval `echo 'cat <<x'` "|| err_exit "eval `echo 'cat <<x'` core dumps"
78*4887Schincat > /dev/null <<EOF # comments should not cause core dumps
79*4887Schinabc
80*4887SchinEOF
81*4887Schincat >$g << :
82*4887Schin:
83*4887Schin:
84*4887Schincmp /dev/null $g 2> /dev/null || err_exit "empty here doc not working"
85*4887Schinx=$(print $( cat <<HUP
86*4887Schinhello
87*4887SchinHUP
88*4887Schin)
89*4887Schin)
90*4887Schinif	[[ $x != hello ]]
91*4887Schinthen	err_exit "here doc inside command sub not working"
92*4887Schinfi
93*4887Schiny=$(cat <<!
94*4887Schin${x:+${x}}
95*4887Schin!
96*4887Schin)
97*4887Schinif	[[ $y != "${x:+${x}}" ]]
98*4887Schinthen	err_exit '${x:+${x}} not working in here document'
99*4887Schinfi
100*4887Schin$SHELL -c '
101*4887Schinx=0
102*4887Schinwhile (( x < 100 ))
103*4887Schindo	((x = x+1))
104*4887Schin	cat << EOF
105*4887SchinEOF
106*4887Schindone
107*4887Schin' 2> /dev/null  || err_exit '100 empty here docs fails'
108*4887Schin{
109*4887Schin	print 'builtin -d cat
110*4887Schin	cat <<- EOF'
111*4887Schin	for ((i=0; i < 100; i++))
112*4887Schin	do print XXXXXXXXXXXXXXXXXXXX
113*4887Schin	done
114*4887Schin	print ' XXX$(date)XXXX
115*4887Schin	EOF'
116*4887Schin} > $f
117*4887Schinchmod +x "$f"
118*4887Schin$SHELL "$f" > /dev/null  || err_exit "large here-doc with command substitution fails"
119*4887Schinx=$(/bin/cat <<!
120*4887Schin$0
121*4887Schin!
122*4887Schin)
123*4887Schin[[ "$x" == "$0" ]] || err_exit '$0 not correct inside here documents'
124*4887Schin$SHELL -c 'x=$(
125*4887Schincat << EOF
126*4887SchinEOF)' 2> /dev/null || err_exit 'here-doc cannot be terminated by )'
127*4887Schinif	[[ $( IFS=:;cat <<-!
128*4887Schin			$IFS$(print hi)$IFS
129*4887Schin		!) != :hi: ]]
130*4887Schinthen	err_exit '$IFS unset by command substitution in here docs'
131*4887Schinfi
132*4887Schinif	x=$($SHELL -c 'cat <<< "hello world"' 2> /dev/null)
133*4887Schinthen	[[ $x == 'hello world' ]] || err_exit '<<< documents not working'
134*4887Schin	x=$($SHELL -c 'v="hello  world";cat <<< $v' 2> /dev/null)
135*4887Schin	[[ $x == 'hello  world' ]] || err_exit '<<< documents with $x not working'
136*4887Schin	x=$($SHELL -c 'v="hello  world";cat <<< "$v"' 2> /dev/null)
137*4887Schin	[[ $x == 'hello  world' ]] || err_exit '<<< documents with $x not working'
138*4887Schinelse	err_exit '<<< syntax not supported'
139*4887Schinfi
140*4887Schinif	[[ $(cat << EOF #testing
141*4887Schin#abc
142*4887Schinabc
143*4887SchinEOF) != $'#abc\nabc' ]]
144*4887Schinthen	err_exit 'comments not preserved in here-documents'
145*4887Schinfi
146*4887Schincat  > "$f" <<- '!!!!' 
147*4887Schin	builtin cat
148*4887Schin	: << EOF
149*4887Schin	$PWD
150*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
151*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
152*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
153*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
154*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
155*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
156*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
157*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
158*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
159*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
160*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
161*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
162*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
163*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
164*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
165*4887Schin	EOF
166*4887Schin	command exec 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&-
167*4887Schin	x=abc
168*4887Schin	cat << EOF
169*4887Schin	$x
170*4887Schin	EOF
171*4887Schin!!!!
172*4887Schinchmod 755 "$f"
173*4887Schinif	[[ $($SHELL  "$f") != abc ]]
174*4887Schinthen	err_exit	'here document descritor was closed'
175*4887Schinfi
176*4887Schincat  > "$f" <<- '!!!!'
177*4887Schin	exec 0<&-
178*4887Schin	foobar()
179*4887Schin	{
180*4887Schin		/bin/cat <<- !
181*4887Schin		foobar
182*4887Schin		!
183*4887Schin	}
184*4887Schin	: << EOF
185*4887Schin	$PWD
186*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
187*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
188*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
189*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
190*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
191*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
192*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
193*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
194*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
195*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
196*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
197*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
198*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
199*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
200*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
201*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
202*4887Schin	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
203*4887Schin	EOF
204*4887Schin	print -r -- "$(foobar)"
205*4887Schin!!!!
206*4887Schinif	[[ $($SHELL  "$f") != foobar ]]
207*4887Schinthen	err_exit	'here document with stdin closed failed'
208*4887Schinfi
209*4887Schinprintf $'cat   <<# \\!!!\n\thello\n\t\tworld\n!!!' > $f
210*4887Schin[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for quoted here documents"
211*4887Schinprintf $'w=world;cat   <<# !!!\n\thello\n\t\t$w\n!!!' > $f
212*4887Schin[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for non-quoted here documents"
213*4887Schinexit $((Errors))
214