1*b30d1939SAndy Fiddaman########################################################################
2*b30d1939SAndy Fiddaman#                                                                      #
3*b30d1939SAndy Fiddaman#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
5*b30d1939SAndy Fiddaman#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
7*b30d1939SAndy Fiddaman#                    by AT&T Intellectual Property                     #
8*b30d1939SAndy Fiddaman#                                                                      #
9*b30d1939SAndy Fiddaman#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12*b30d1939SAndy Fiddaman#                                                                      #
13*b30d1939SAndy Fiddaman#              Information and Software Systems Research               #
14*b30d1939SAndy Fiddaman#                            AT&T Research                             #
15*b30d1939SAndy Fiddaman#                           Florham Park NJ                            #
16*b30d1939SAndy Fiddaman#                                                                      #
17*b30d1939SAndy Fiddaman#                  David Korn <dgk@research.att.com>                   #
18*b30d1939SAndy Fiddaman#                                                                      #
19*b30d1939SAndy Fiddaman########################################################################
20*b30d1939SAndy Fiddaman# test the behavior of co-processes
21*b30d1939SAndy Fiddamanfunction err_exit
22*b30d1939SAndy Fiddaman{
23*b30d1939SAndy Fiddaman	print -u2 -n "\t"
24*b30d1939SAndy Fiddaman	print -u2 -r ${Command}[$1]: "${@:2}"
25*b30d1939SAndy Fiddaman	let Errors+=1
26*b30d1939SAndy Fiddaman}
27*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO'
28*b30d1939SAndy Fiddaman
29*b30d1939SAndy FiddamanCommand=${0##*/}
30*b30d1939SAndy Fiddamaninteger Errors=0
31*b30d1939SAndy Fiddaman
32*b30d1939SAndy Fiddamantmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
33*b30d1939SAndy Fiddamantrap "cd /; rm -rf $tmp" EXIT
34*b30d1939SAndy Fiddaman
35*b30d1939SAndy Fiddamanif	[[ -d /cygdrive ]]
36*b30d1939SAndy Fiddamanthen	err_exit cygwin detected - coprocess tests disabled - enable at the risk of wedging your system
37*b30d1939SAndy Fiddaman	exit $((Errors))
38*b30d1939SAndy Fiddamanfi
39*b30d1939SAndy Fiddaman
40*b30d1939SAndy Fiddamanbintrue=$(whence -p true)
41*b30d1939SAndy Fiddaman
42*b30d1939SAndy Fiddamanfunction ping # id
43*b30d1939SAndy Fiddaman{
44*b30d1939SAndy Fiddaman	integer x=0
45*b30d1939SAndy Fiddaman	while ((x++ < 5))
46*b30d1939SAndy Fiddaman	do	read -r
47*b30d1939SAndy Fiddaman		print -r "$1 $REPLY"
48*b30d1939SAndy Fiddaman	done
49*b30d1939SAndy Fiddaman}
50*b30d1939SAndy Fiddaman
51*b30d1939SAndy Fiddamanbincat=$(whence -p cat)
52*b30d1939SAndy Fiddamanbuiltin cat
53*b30d1939SAndy Fiddaman
54*b30d1939SAndy Fiddamanfor cat in cat $bincat
55*b30d1939SAndy Fiddamando
56*b30d1939SAndy Fiddaman
57*b30d1939SAndy Fiddaman	$cat |&
58*b30d1939SAndy Fiddaman	print -p "hello"
59*b30d1939SAndy Fiddaman	read -p line
60*b30d1939SAndy Fiddaman	[[ $line == hello ]] || err_exit "$cat coprocessing fails"
61*b30d1939SAndy Fiddaman	exec 5>&p 6<&p
62*b30d1939SAndy Fiddaman	print -u5 'hello again' || err_exit "write on $cat coprocess u5 fails"
63*b30d1939SAndy Fiddaman	read -u6 line
64*b30d1939SAndy Fiddaman	[[ $line == 'hello again' ]] || err_exit "$cat coprocess after moving fds fails"
65*b30d1939SAndy Fiddaman	exec 5<&- 6<&-
66*b30d1939SAndy Fiddaman	wait $!
67*b30d1939SAndy Fiddaman
68*b30d1939SAndy Fiddaman	ping three |&
69*b30d1939SAndy Fiddaman	exec 3>&p
70*b30d1939SAndy Fiddaman	ping four |&
71*b30d1939SAndy Fiddaman	exec 4>&p
72*b30d1939SAndy Fiddaman	ping pipe |&
73*b30d1939SAndy Fiddaman
74*b30d1939SAndy Fiddaman	integer count
75*b30d1939SAndy Fiddaman	for i in three four pipe four pipe four three pipe pipe three pipe
76*b30d1939SAndy Fiddaman	do	case $i in
77*b30d1939SAndy Fiddaman		three)	to=-u3;;
78*b30d1939SAndy Fiddaman		four)	to=-u4;;
79*b30d1939SAndy Fiddaman		pipe)	to=-p;;
80*b30d1939SAndy Fiddaman		esac
81*b30d1939SAndy Fiddaman		(( count++ ))
82*b30d1939SAndy Fiddaman		print $to $i $count
83*b30d1939SAndy Fiddaman	done
84*b30d1939SAndy Fiddaman
85*b30d1939SAndy Fiddaman	while	((count > 0))
86*b30d1939SAndy Fiddaman	do	(( count-- ))
87*b30d1939SAndy Fiddaman		read -p
88*b30d1939SAndy Fiddaman		set -- $REPLY
89*b30d1939SAndy Fiddaman		if	[[ $1 != $2 ]]
90*b30d1939SAndy Fiddaman		then	err_exit "$cat coprocess $1 does not match $2"
91*b30d1939SAndy Fiddaman		fi
92*b30d1939SAndy Fiddaman		case $1 in
93*b30d1939SAndy Fiddaman		three)	;;
94*b30d1939SAndy Fiddaman		four)	;;
95*b30d1939SAndy Fiddaman		pipe)	;;
96*b30d1939SAndy Fiddaman		*)	err_exit "$cat coprocess unknown message +|$REPLY|+" ;;
97*b30d1939SAndy Fiddaman		esac
98*b30d1939SAndy Fiddaman	done
99*b30d1939SAndy Fiddaman	kill $(jobs -p) 2>/dev/null
100*b30d1939SAndy Fiddaman
101*b30d1939SAndy Fiddaman	file=$tmp/regress
102*b30d1939SAndy Fiddaman	$cat > $file  <<-!
103*b30d1939SAndy Fiddaman	$cat |&
104*b30d1939SAndy Fiddaman	!
105*b30d1939SAndy Fiddaman	chmod +x $file
106*b30d1939SAndy Fiddaman	sleep 10 |&
107*b30d1939SAndy Fiddaman	$file 2> /dev/null || err_exit "parent $cat coprocess prevents script coprocess"
108*b30d1939SAndy Fiddaman	exec 5<&p 6>&p
109*b30d1939SAndy Fiddaman	exec 5<&- 6>&-
110*b30d1939SAndy Fiddaman	kill $(jobs -p) 2>/dev/null
111*b30d1939SAndy Fiddaman
112*b30d1939SAndy Fiddaman	${SHELL-ksh} |&
113*b30d1939SAndy Fiddaman	cop=$!
114*b30d1939SAndy Fiddaman	exp=Done
115*b30d1939SAndy Fiddaman	print -p $'print hello | '$cat$'\nprint '$exp
116*b30d1939SAndy Fiddaman	read -t 5 -p
117*b30d1939SAndy Fiddaman	read -t 5 -p
118*b30d1939SAndy Fiddaman	got=$REPLY
119*b30d1939SAndy Fiddaman	if	[[ $got != $exp ]]
120*b30d1939SAndy Fiddaman	then	err_exit "${SHELL-ksh} $cat coprocess io failed -- got '$got', expected '$exp'"
121*b30d1939SAndy Fiddaman	fi
122*b30d1939SAndy Fiddaman	exec 5<&p 6>&p
123*b30d1939SAndy Fiddaman	exec 5<&- 6>&-
124*b30d1939SAndy Fiddaman	{ sleep 4; kill $cop; } 2>/dev/null &
125*b30d1939SAndy Fiddaman	spy=$!
126*b30d1939SAndy Fiddaman	if	wait $cop 2>/dev/null
127*b30d1939SAndy Fiddaman	then	kill $spy 2>/dev/null
128*b30d1939SAndy Fiddaman	else	err_exit "$cat coprocess hung after 'exec 5<&p 6>&p; exec 5<&- 6>&-'"
129*b30d1939SAndy Fiddaman	fi
130*b30d1939SAndy Fiddaman	wait
131*b30d1939SAndy Fiddaman
132*b30d1939SAndy Fiddaman	{
133*b30d1939SAndy Fiddaman	echo line1 | grep 'line2'
134*b30d1939SAndy Fiddaman	echo line2 | grep 'line1'
135*b30d1939SAndy Fiddaman	} |&
136*b30d1939SAndy Fiddaman	SECONDS=0 count=0
137*b30d1939SAndy Fiddaman	while	read -p -t 10 line
138*b30d1939SAndy Fiddaman	do	((count++))
139*b30d1939SAndy Fiddaman	done
140*b30d1939SAndy Fiddaman	if	(( SECONDS > 8 ))
141*b30d1939SAndy Fiddaman	then	err_exit "$cat coprocess read -p hanging (SECONDS=$SECONDS count=$count)"
142*b30d1939SAndy Fiddaman	fi
143*b30d1939SAndy Fiddaman	wait $!
144*b30d1939SAndy Fiddaman
145*b30d1939SAndy Fiddaman	( sleep 3 |& sleep 1 && kill $!; sleep 1; sleep 3 |& sleep 1 && kill $! ) ||
146*b30d1939SAndy Fiddaman		err_exit "$cat coprocess cleanup not working correctly"
147*b30d1939SAndy Fiddaman	{ : |& } 2>/dev/null ||
148*b30d1939SAndy Fiddaman		err_exit "subshell $cat coprocess lingers in parent"
149*b30d1939SAndy Fiddaman	wait $!
150*b30d1939SAndy Fiddaman
151*b30d1939SAndy Fiddaman	unset N r e
152*b30d1939SAndy Fiddaman	integer N=5
153*b30d1939SAndy Fiddaman	e=12345
154*b30d1939SAndy Fiddaman	(
155*b30d1939SAndy Fiddaman		integer i
156*b30d1939SAndy Fiddaman		for ((i = 1; i <= N; i++))
157*b30d1939SAndy Fiddaman		do	print $i |&
158*b30d1939SAndy Fiddaman			read -p r
159*b30d1939SAndy Fiddaman			print -n $r
160*b30d1939SAndy Fiddaman			wait $!
161*b30d1939SAndy Fiddaman		done
162*b30d1939SAndy Fiddaman		print
163*b30d1939SAndy Fiddaman	) 2>/dev/null | read -t 10 r
164*b30d1939SAndy Fiddaman	[[ $r == $e ]] || err_exit "$cat coprocess timing bug -- expected $e, got '$r'"
165*b30d1939SAndy Fiddaman
166*b30d1939SAndy Fiddaman	r=
167*b30d1939SAndy Fiddaman	(
168*b30d1939SAndy Fiddaman		integer i
169*b30d1939SAndy Fiddaman		for ((i = 1; i <= N; i++))
170*b30d1939SAndy Fiddaman		do	print $i |&
171*b30d1939SAndy Fiddaman			sleep 0.01
172*b30d1939SAndy Fiddaman			r=$r$($cat <&p)
173*b30d1939SAndy Fiddaman			wait $!
174*b30d1939SAndy Fiddaman		done
175*b30d1939SAndy Fiddaman		print $r
176*b30d1939SAndy Fiddaman	) 2>/dev/null | read -t 10 r
177*b30d1939SAndy Fiddaman	[[ $r == $e ]] || err_exit "$cat coprocess command substitution bug -- expected $e, got '$r'"
178*b30d1939SAndy Fiddaman
179*b30d1939SAndy Fiddaman	(
180*b30d1939SAndy Fiddaman		$cat |&
181*b30d1939SAndy Fiddaman		sleep 0.01
182*b30d1939SAndy Fiddaman		exec 6>&p
183*b30d1939SAndy Fiddaman		print -u6 ok
184*b30d1939SAndy Fiddaman		exec 6>&-
185*b30d1939SAndy Fiddaman		sleep 2
186*b30d1939SAndy Fiddaman		kill $! 2> /dev/null
187*b30d1939SAndy Fiddaman	) && err_exit "$cat coprocess with subshell would hang"
188*b30d1939SAndy Fiddaman	for sig in IOT ABRT
189*b30d1939SAndy Fiddaman	do	if	( trap - $sig ) 2> /dev/null
190*b30d1939SAndy Fiddaman		then	if	[[ $( { sig=$sig $SHELL  2> /dev/null <<- ++EOF++
191*b30d1939SAndy Fiddaman					$cat |&
192*b30d1939SAndy Fiddaman					pid=\$!
193*b30d1939SAndy Fiddaman					trap "print TRAP" \$sig
194*b30d1939SAndy Fiddaman					(
195*b30d1939SAndy Fiddaman						sleep 2
196*b30d1939SAndy Fiddaman						kill -\$sig \$\$
197*b30d1939SAndy Fiddaman						sleep 2
198*b30d1939SAndy Fiddaman						kill -\$sig \$\$
199*b30d1939SAndy Fiddaman						kill \$pid
200*b30d1939SAndy Fiddaman						sleep 2
201*b30d1939SAndy Fiddaman						kill \$\$
202*b30d1939SAndy Fiddaman					) &
203*b30d1939SAndy Fiddaman					while	read -p || ((\$? > 256))
204*b30d1939SAndy Fiddaman					do	:
205*b30d1939SAndy Fiddaman					done
206*b30d1939SAndy Fiddaman				++EOF++
207*b30d1939SAndy Fiddaman				} ) != $'TRAP\nTRAP' ]] 2> /dev/null
208*b30d1939SAndy Fiddaman			then	err_exit "traps when reading from $cat coprocess not working"
209*b30d1939SAndy Fiddaman			fi
210*b30d1939SAndy Fiddaman			break
211*b30d1939SAndy Fiddaman		fi
212*b30d1939SAndy Fiddaman	done
213*b30d1939SAndy Fiddaman
214*b30d1939SAndy Fiddaman	trap 'sleep_pid=; kill $pid; err_exit "$cat coprocess 1 hung"' TERM
215*b30d1939SAndy Fiddaman	{ sleep 5; kill $$; } &
216*b30d1939SAndy Fiddaman	sleep_pid=$!
217*b30d1939SAndy Fiddaman	$cat |&
218*b30d1939SAndy Fiddaman	pid=$!
219*b30d1939SAndy Fiddaman	exec 5<&p 6>&p
220*b30d1939SAndy Fiddaman	exp=hi
221*b30d1939SAndy Fiddaman	print -u6 $exp; read -u5
222*b30d1939SAndy Fiddaman	[[ $REPLY == "$exp" ]] || err_exit "REPLY from $cat coprocess failed -- expected '$exp', got '$REPLY'"
223*b30d1939SAndy Fiddaman	exec 6>&-
224*b30d1939SAndy Fiddaman	wait $pid
225*b30d1939SAndy Fiddaman	trap - TERM
226*b30d1939SAndy Fiddaman	[[ $sleep_pid ]] && kill $sleep_pid
227*b30d1939SAndy Fiddaman
228*b30d1939SAndy Fiddaman	trap 'sleep_pid=; kill $pid; err_exit "$cat coprocess 2 hung"' TERM
229*b30d1939SAndy Fiddaman	{ sleep 5; kill $$; } &
230*b30d1939SAndy Fiddaman	sleep_pid=$!
231*b30d1939SAndy Fiddaman	$cat |&
232*b30d1939SAndy Fiddaman	pid=$!
233*b30d1939SAndy Fiddaman	print foo >&p 2> /dev/null || err_exit "first write of foo to $cat coprocess failed"
234*b30d1939SAndy Fiddaman	print foo >&p 2> /dev/null || err_exit "second write of foo to coprocess failed"
235*b30d1939SAndy Fiddaman	kill $pid
236*b30d1939SAndy Fiddaman	wait $pid 2> /dev/null
237*b30d1939SAndy Fiddaman	trap - TERM
238*b30d1939SAndy Fiddaman	[[ $sleep_pid ]] && kill $sleep_pid
239*b30d1939SAndy Fiddaman
240*b30d1939SAndy Fiddaman	trap 'sleep_pid=; kill $pid; err_exit "$cat coprocess 3 hung"' TERM
241*b30d1939SAndy Fiddaman	{ sleep 5; kill $$; } &
242*b30d1939SAndy Fiddaman	sleep_pid=$!
243*b30d1939SAndy Fiddaman	$cat |&
244*b30d1939SAndy Fiddaman	pid=$!
245*b30d1939SAndy Fiddaman	print -p foo
246*b30d1939SAndy Fiddaman	print -p bar
247*b30d1939SAndy Fiddaman	read <&p || err_exit "first read from $cat coprocess failed"
248*b30d1939SAndy Fiddaman	[[ $REPLY == foo ]] || err_exit "first REPLY from $cat coprocess is $REPLY not foo"
249*b30d1939SAndy Fiddaman	read <&p || err_exit "second read from $cat coprocess failed"
250*b30d1939SAndy Fiddaman	[[ $REPLY == bar ]] || err_exit "second REPLY from $cat coprocess is $REPLY not bar"
251*b30d1939SAndy Fiddaman	kill $pid
252*b30d1939SAndy Fiddaman	wait $pid 2> /dev/null
253*b30d1939SAndy Fiddaman	trap - TERM
254*b30d1939SAndy Fiddaman	[[ $sleep_pid ]] && kill $sleep_pid
255*b30d1939SAndy Fiddaman
256*b30d1939SAndy Fiddamandone
257*b30d1939SAndy Fiddaman
258*b30d1939SAndy Fiddamanexp=ksh
259*b30d1939SAndy Fiddamangot=$(print -r $'#00315
260*b30d1939SAndy FiddamanCOATTRIBUTES=\'label=make \'
261*b30d1939SAndy Fiddaman# @(#)$Id: libcoshell (AT&T Research) 2008-04-28 $
262*b30d1939SAndy Fiddaman_COSHELL_msgfd=5
263*b30d1939SAndy Fiddaman{ { (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)
264*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "coshell(3) identification sequence failed -- expected '$exp', got '$got'"
265*b30d1939SAndy Fiddaman
266*b30d1939SAndy Fiddamanfunction cop
267*b30d1939SAndy Fiddaman{
268*b30d1939SAndy Fiddaman	read
269*b30d1939SAndy Fiddaman	print ok
270*b30d1939SAndy Fiddaman}
271*b30d1939SAndy Fiddaman
272*b30d1939SAndy Fiddamanexp=ok
273*b30d1939SAndy Fiddaman
274*b30d1939SAndy Fiddamancop |&
275*b30d1939SAndy Fiddamanpid=$!
276*b30d1939SAndy Fiddamanif	print -p yo 2>/dev/null
277*b30d1939SAndy Fiddamanthen	read -p got
278*b30d1939SAndy Fiddamanelse	got='no coprocess'
279*b30d1939SAndy Fiddamanfi
280*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "main coprocess main query failed -- expected $exp, got '$got'"
281*b30d1939SAndy Fiddamankill $pid 2>/dev/null
282*b30d1939SAndy Fiddamanwait
283*b30d1939SAndy Fiddaman
284*b30d1939SAndy Fiddamancop |&
285*b30d1939SAndy Fiddamanpid=$!
286*b30d1939SAndy Fiddaman(
287*b30d1939SAndy Fiddamanif	print -p yo 2>/dev/null
288*b30d1939SAndy Fiddamanthen	read -p got
289*b30d1939SAndy Fiddamanelse	got='no coprocess'
290*b30d1939SAndy Fiddamanfi
291*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "main coprocess subshell query failed -- expected $exp, got '$got'"
292*b30d1939SAndy Fiddaman)
293*b30d1939SAndy Fiddamankill $pid 2>/dev/null
294*b30d1939SAndy Fiddamanwait
295*b30d1939SAndy Fiddaman
296*b30d1939SAndy Fiddamanexp='no coprocess'
297*b30d1939SAndy Fiddaman
298*b30d1939SAndy Fiddaman(
299*b30d1939SAndy Fiddamancop |&
300*b30d1939SAndy Fiddamanprint $! > $tmp/pid
301*b30d1939SAndy Fiddaman)
302*b30d1939SAndy Fiddamanpid=$(<$tmp/pid)
303*b30d1939SAndy Fiddamanif	print -p yo 2>/dev/null
304*b30d1939SAndy Fiddamanthen	read -p got
305*b30d1939SAndy Fiddamanelse	got=$exp
306*b30d1939SAndy Fiddamanfi
307*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "subshell coprocess main query failed -- expected $exp, got '$got'"
308*b30d1939SAndy Fiddamankill $pid 2>/dev/null
309*b30d1939SAndy Fiddamanwait
310*b30d1939SAndy Fiddaman
311*b30d1939SAndy Fiddaman(
312*b30d1939SAndy Fiddamancop |&
313*b30d1939SAndy Fiddamanprint $! > $tmp/pid
314*b30d1939SAndy Fiddaman)
315*b30d1939SAndy Fiddamanpid=$(<$tmp/pid)
316*b30d1939SAndy Fiddaman(
317*b30d1939SAndy Fiddamanif	print -p yo 2>/dev/null
318*b30d1939SAndy Fiddamanthen	read -p got
319*b30d1939SAndy Fiddamanelse	got=$exp
320*b30d1939SAndy Fiddamanfi
321*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "subshell coprocess subshell query failed -- expected $exp, got '$got'"
322*b30d1939SAndy Fiddamankill $pid 2>/dev/null
323*b30d1939SAndy Fiddamanwait
324*b30d1939SAndy Fiddaman)
325*b30d1939SAndy Fiddaman
326*b30d1939SAndy Fiddamanfunction mypipe
327*b30d1939SAndy Fiddaman{
328*b30d1939SAndy Fiddaman	read; read
329*b30d1939SAndy Fiddaman	print -r -- "$REPLY"
330*b30d1939SAndy Fiddaman}
331*b30d1939SAndy Fiddaman
332*b30d1939SAndy Fiddamanmypipe |&
333*b30d1939SAndy Fiddamanprint -p "hello"
334*b30d1939SAndy Fiddamanz="$( $bintrue $($bintrue) )"
335*b30d1939SAndy Fiddaman{ print -p "world";} 2> /dev/null
336*b30d1939SAndy Fiddamanread -p
337*b30d1939SAndy Fiddaman[[ $REPLY == world ]] ||  err_exit "expected 'world' got '$REPLY'"
338*b30d1939SAndy Fiddamankill $pid 2>/dev/null
339*b30d1939SAndy Fiddamanwait
340*b30d1939SAndy Fiddaman
341*b30d1939SAndy Fiddaman
342*b30d1939SAndy Fiddamanfunction cop
343*b30d1939SAndy Fiddaman{
344*b30d1939SAndy Fiddaman        read
345*b30d1939SAndy Fiddaman        print ok
346*b30d1939SAndy Fiddaman}
347*b30d1939SAndy Fiddamanexp=ok
348*b30d1939SAndy Fiddamancop |&
349*b30d1939SAndy Fiddamanpid=$!
350*b30d1939SAndy Fiddaman(
351*b30d1939SAndy Fiddamanif      print -p yo 2>/dev/null
352*b30d1939SAndy Fiddamanthen    read -p got
353*b30d1939SAndy Fiddamanelse    got='no coprocess'
354*b30d1939SAndy Fiddamanfi
355*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "main coprocess subshell query failed -- expected $exp, got '$got'"
356*b30d1939SAndy Fiddaman)
357*b30d1939SAndy Fiddamankill $pid 2>/dev/null
358*b30d1939SAndy Fiddamanwait
359*b30d1939SAndy Fiddaman
360*b30d1939SAndy Fiddamantee=$(whence -p tee)
361*b30d1939SAndy Fiddamanls -l |&
362*b30d1939SAndy Fiddamanpid=$!
363*b30d1939SAndy Fiddaman$tee -a /dev/null <&p > /dev/null
364*b30d1939SAndy Fiddamanwait $pid
365*b30d1939SAndy Fiddamanx=$?
366*b30d1939SAndy Fiddaman[[ $x == 0 ]] || err_exit "coprocess exitval should be 0, not $x"
367*b30d1939SAndy Fiddaman
368*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
369