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