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########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# test the behavior of co-processes
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
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ -d /cygdrive ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit cygwin detected - coprocess tests disabled - enable at the risk of wedging your system
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exit $((Errors))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction ping # id
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin integer x=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while ((x++ < 5))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do read -r
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r "$1 $REPLY"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -p "hello"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread -p line
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $line == hello ]] || err_exit 'coprocessing fails'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5>&p 6<&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -u5 'hello again' || err_exit 'write on u5 fails'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread -u6 line
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $line == 'hello again' ]] || err_exit 'coprocess after moving fds fails'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5<&- 6<&-
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwait $!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinping three |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 3>&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinping four |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 4>&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinping pipe |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger count
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor i in three four pipe four pipe four three pipe pipe three pipe
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo case $i in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin three) to=-u3;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin four) to=-u4;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pipe) to=-p;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( count++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print $to $i $count
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile ((count > 0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo (( count-- ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin read -p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -- $REPLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ $1 != $2 ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then err_exit "$1 does not match $2"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin three) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin four) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pipe) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) err_exit "unknown message +|$REPLY|+" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinkill $(jobs -p) 2>/dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfile=$tmp/regress
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > $file <<\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/bin/cat |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchmod +x $file
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinsleep 10 |&
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$file 2> /dev/null || err_exit "parent coprocess prevents script coprocess"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5<&p 6>&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5<&- 6>&-
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinkill $(jobs -p) 2>/dev/null
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin${SHELL-ksh} |&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcop=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=Done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint -p $'print hello | cat\nprint '$exp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread -t 5 -p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread -t 5 -p
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$REPLY
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $got != $exp ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "${SHELL-ksh} coprocess io failed -- got '$got', expected '$exp'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5<&p 6>&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5<&- 6>&-
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ sleep 4; kill $cop; } 2>/dev/null &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzspy=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif wait $cop 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen kill $spy 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse err_exit "coprocess hung after 'exec 5<&p 6>&p; exec 5<&- 6>&-'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinecho line1 | grep 'line2'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinecho line2 | grep 'line1'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} |&
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinSECONDS=0 count=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile read -p -t 10 line
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo ((count++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif (( SECONDS > 8 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "read -p hanging (SECONDS=$SECONDS count=$count)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwait $!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz( sleep 3 |& sleep 1 && kill $!; sleep 1; sleep 3 |& sleep 1 && kill $! ) ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit "coprocess cleanup not working correctly"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{ : |& } 2>/dev/null ||
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "subshell coprocess lingers in parent"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwait $!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset N r e
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger N=5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chine=12345
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((i = 1; i <= N; i++))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do print $i |&
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin read -p r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -n $r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin wait $!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin) 2>/dev/null | read -t 10 r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $r == $e ]] || err_exit "coprocess timing bug -- expected $e, got '$r'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinr=
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((i = 1; i <= N; i++))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do print $i |&
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 0.01
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin r=$r$(cat <&p)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin wait $!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print $r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin) 2>/dev/null | read -t 10 r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $r == $e ]] || err_exit "coprocess command substitution bug -- expected $e, got '$r'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /bin/cat |&
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 0.01
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exec 6>&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u6 ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exec 6>&-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sleep 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz kill $! 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin) && err_exit 'coprocess with subshell would hang'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor sig in IOT ABRT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo if ( trap - $sig ) 2> /dev/null
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then if [[ $( { sig=$sig $SHELL 2> /dev/null <<- '++EOF++'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cat |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pid=$!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap "print TRAP" $sig
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sleep 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kill -$sig $$
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sleep 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kill -$sig $$
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kill $pid
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz kill $$
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ) &
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin read -p
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ++EOF++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin } ) != $'TRAP\nTRAP' ]] 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit 'traps when reading from coprocess not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap 'sleep_pid=; kill $pid; err_exit "coprocess 1 hung"' TERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ sleep 5; kill $$; } &
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsleep_pid=$!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbuiltin cat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpid=$!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 5<&p 6>&p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -u6 hi; read -u5
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY == hi ]] || err_exit 'REPLY is $REPLY not hi'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec 6>&-
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwait $pid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap - TERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $sleep_pid ]] && kill $sleep_pid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap 'sleep_pid=; kill $pid; err_exit "coprocess 2 hung"' TERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ sleep 5; kill $$; } &
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsleep_pid=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpid=$!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint foo >&p 2> /dev/null || err_exit 'first write of foo to coprocess failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint foo >&p 2> /dev/null || err_exit 'second write of foo to coprocess failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinkill $pid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwait $pid 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap - TERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $sleep_pid ]] && kill $sleep_pid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap 'sleep_pid=; kill $pid; err_exit "coprocess 3 hung"' TERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ sleep 5; kill $$; } &
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsleep_pid=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat |&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpid=$!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -p foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint -p bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread <&p || err_exit 'first read from coprocess failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY == foo ]] || err_exit "first REPLY is $REPLY not foo"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinread <&p || err_exit 'second read from coprocess failed'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $REPLY == bar ]] || err_exit "second REPLY is $REPLY not bar"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinkill $pid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwait $pid 2> /dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap - TERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $sleep_pid ]] && kill $sleep_pid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=ksh
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$(print -r $'#00315
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCOATTRIBUTES=\'label=make \'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# @(#)$Id: libcoshell (AT&T Research) 2008-04-28 $
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz_COSHELL_msgfd=5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ { (eval \'function fun { trap \":\" 0; return 1; }; trap \"exit 0\" 0; fun; exit 1\') && PATH= print -u$_COSHELL_msgfd ksh; } || { times && echo bsh >&$_COSHELL_msgfd; } || { echo osh >&$_COSHELL_msgfd; }; } >/dev/null 2>&1' | $SHELL 5>&1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "coshell(3) identification sequence failed -- expected '$exp', got '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction cop
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz read
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print ok
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=ok
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcop |&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzpid=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif print -p yo 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen read -p got
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse got='no coprocess'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "main coprocess main query failed -- expected $exp, got '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzkill $pid 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcop |&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzpid=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif print -p yo 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen read -p got
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse got='no coprocess'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "main coprocess subshell query failed -- expected $exp, got '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzkill $pid 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp='no coprocess'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcop |&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint $! > $tmp/pid
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzpid=$(<$tmp/pid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif print -p yo 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen read -p got
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse got=$exp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "subshell coprocess main query failed -- expected $exp, got '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzkill $pid 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcop |&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint $! > $tmp/pid
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzpid=$(<$tmp/pid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif print -p yo 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen read -p got
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse got=$exp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == $exp ]] || err_exit "subshell coprocess subshell query failed -- expected $exp, got '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzkill $pid 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))