da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction err_exit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -n "\t"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -r ${Command}[$1]: "${@:2}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin let Errors+=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias err_exit='err_exit $LINENO'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinCommand=${0##*/}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger Errors=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzf=$tmp/here1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzg=$tmp/here2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $f <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(<$f) != 'hello world' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "'hello world' here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'hello world' quoted here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<- !
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hello world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'hello world' tabbed here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<- \!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hello world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'hello world' quoted tabbed here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=hello
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$x world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'$x world' here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$(print hello) world
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'$(print hello) world' here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $f <<\!!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!@#$%%^^&*()_+~"::~;'`<>?/.,{}[]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(<$f) != '!@#$%%^^&*()_+~"::~;'\''`<>?/.,{}[]' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "'hello world' here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<!!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!@#\$%%^^&*()_+~"::~;'\`<>?/.,{}[]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "unquoted here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 3<<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(<&3) != ' foo' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "leading tabs stripped with <<!"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL -c "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chineval `echo 'cat <<x'` "|| err_exit "eval `echo 'cat <<x'` core dumps"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > /dev/null <<EOF # comments should not cause core dumps
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinabc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat >$g << :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp /dev/null $g 2> /dev/null || err_exit "empty here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$(print $( cat <<HUP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhello
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinHUP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $x != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "here doc inside command sub not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chiny=$(cat <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin${x:+${x}}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $y != "${x:+${x}}" ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '${x:+${x}} not working in here document'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL -c '
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile (( x < 100 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo ((x = x+1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin' 2> /dev/null || err_exit '100 empty here docs fails'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print 'builtin -d cat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat <<- EOF'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for ((i=0; i < 100; i++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do print XXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print ' XXX$(date)XXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin EOF'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} > $f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchmod +x "$f"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL "$f" > /dev/null || err_exit "large here-doc with command substitution fails"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=$(/bin/cat <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ "$x" == "$0" ]] || err_exit '$0 not correct inside here documents'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL -c 'x=$(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF)' 2> /dev/null || err_exit 'here-doc cannot be terminated by )'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( IFS=:;cat <<-!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin $IFS$(print hi)$IFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !) != :hi: ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '$IFS unset by command substitution in here docs'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif x=$($SHELL -c 'cat <<< "hello world"' 2> /dev/null)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen [[ $x == 'hello world' ]] || err_exit '<<< documents not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x=$($SHELL -c 'v="hello world";cat <<< $v' 2> /dev/null)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $x == 'hello world' ]] || err_exit '<<< documents with $x not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x=$($SHELL -c 'v="hello world";cat <<< "$v"' 2> /dev/null)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $x == 'hello world' ]] || err_exit '<<< documents with $x not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinelse err_exit '<<< syntax not supported'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(cat << EOF #testing
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#abc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinabc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF) != $'#abc\nabc' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'comments not preserved in here-documents'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > "$f" <<- '!!!!'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin builtin cat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin : << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin $PWD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command exec 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x=abc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin $x
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!!!!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchmod 755 "$f"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $($SHELL "$f") != abc ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'here document descritor was closed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > "$f" <<- '!!!!'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exec 0<&-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foobar()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /bin/cat <<- !
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin : << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin $PWD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r -- "$(foobar)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!!!!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $($SHELL "$f") != foobar ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'here document with stdin closed failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprintf $'cat <<# \\!!!\n\thello\n\t\tworld\n!!!' > $f
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for quoted here documents"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprintf $'w=world;cat <<# !!!\n\thello\n\t\t$w\n!!!' > $f
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for non-quoted here documents"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $( $SHELL <<- \++++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin S=( typeset a )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function S.a.get
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin .sh.value=$__a
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin __a=1234
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cat <<-EOF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ${S.a}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin EOF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin++++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin) == 1234 ]] 2> /dev/null || err_exit 'here document with get discipline failed'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $($SHELL -c 'g(){ print ok;}; cat <<- EOF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ${ g;}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin EOF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ' 2> /dev/null) == ok ]] || err_exit '${ command;} not working in heredoc'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzscript=$f
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor ((i=0; i < 406; i++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo print ': 23456789012345678'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint : 123456789123
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat <<- \EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzeval "$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz { cat ; } <<MARKER
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print hello
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz MARKER
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzEOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz} > $script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x $script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL $script) == hello ]] 2> /dev/null || err_exit 'heredoc embeded in command substitution fails at buffer boundary'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$( cat << EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz\
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzabc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzEOF)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == abc ]] || err_exit 'line continuation at start of buffer not working'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))