maart@nat.vu.nl (Maarten Litmaath) (06/05/91)
This version is more bulletproof. --------------------cut here-------------------- #!/bin/sh # @(#)ersh 3.0 91/06/04 Maarten Litmaath # This rsh front-end returns the exit status of the remote command, # or 99 if the connection is broken prematurely. # It works OK with sh/csh-compatible shells on the remote (!) side. # If there is no remote command present, rlogin is invoked, which # need not return a meaningful exit status. # Usage: see rsh(1). RSH=/usr/ucb/rsh RLOGIN=/usr/ucb/rlogin hostname= lflag= nflag= user= case $1 in -l) ;; *) hostname=${1?'hostname expected'} shift esac case $1 in -l) lflag=-l shift user=${1?'username expected after -l flag'} shift esac case $1 in -n) nflag=-n shift esac case $hostname in '') hostname=${1?'hostname expected'} shift esac case $# in 0) exec $RLOGIN $lflag $user "$hostname" esac id=ersh.$$.`date | awk '{ print $4; }'` hangup=99 AWK=' prprev == 1 { print prev0; prprev = 0; } $1 == "'$id'" { prev0 = $0; prev2 = $2; prev3 = $3; prprev = 1; next; } { print; } END { if (prprev == 0) { exit('$hangup'); } if (prev2 ~ /^[0-9]+0$/) { exit(prev2 / 10); } if (prev2 ~ /^0$/ && prev3 ~ /^[0-9]+$/) { exit(prev3); } exit('$hangup'); } ' exec 3>&1 cmd="( ${*-:} ); exec sh -c 'echo $id "'"$0 $1" >&2'\'' $?0 "$status"' $RSH "$hostname" $lflag $user $nflag "$cmd" 2>&1 >&3 3>&- | awk "$AWK" >&2 3>&-