heredoc.sh revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Copyright (c) 1982-2007 AT&T Knowledge Ventures #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# by AT&T Knowledge Ventures #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'hello world' quoted here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'hello world' tabbed here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $g <<- \!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'hello world' quoted tabbed here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'$x world' here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "'$(print hello) world' here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!@#$%%^^&*()_+~"::~;'`<>?/.,{}[]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(<$f) != '!@#$%%^^&*()_+~"::~;'\''`<>?/.,{}[]' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!@#\$%%^^&*()_+~"::~;'\`<>?/.,{}[]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp $f $g 2> /dev/null || err_exit "unquoted here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chineval `echo 'cat <<x'` "|| err_exit "eval `echo 'cat <<x'` core dumps"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > /dev/null <<EOF # comments should not cause core dumps
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincmp /dev/null $g 2> /dev/null || err_exit "empty here doc not working"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $x != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $y != "${x:+${x}}" ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile (( x < 100 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo ((x = x+1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat <<- EOF'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin$SHELL "$f" > /dev/null || err_exit "large here-doc with command substitution fails"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ "$x" == "$0" ]] || err_exit '$0 not correct inside here documents'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF)' 2> /dev/null || err_exit 'here-doc cannot be terminated by )'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( IFS=:;cat <<-!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '$IFS unset by command substitution in here docs'
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'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF) != $'#abc\nabc' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'comments not preserved in here-documents'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > "$f" <<- '!!!!'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin builtin cat
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 command exec 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat << EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchmod 755 "$f"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $($SHELL "$f") != abc ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'here document descritor was closed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > "$f" <<- '!!!!'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /bin/cat <<- !
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 print -r -- "$(foobar)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $($SHELL "$f") != foobar ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'here document with stdin closed failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprintf $'cat <<# \\!!!\n\thello\n\t\tworld\n!!!' > $f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $($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
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for non-quoted here documents"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))