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