# vi:set sts=2 sw=2 ai: # # coshell.bash - Control shell coprocesses (see coprocess.bash). # function coshell () { while (( $# > 0 )) ; do case "$1" in # # coshell open # o|op|ope|open) shift coprocess open "$@" local ret=$? # This should eat any ssh error messages or what not. coshell eval : >/dev/null 2>&1 return $ret ;; # # coshell close # c|cl|clo|close) shift coprocess close "$@" return $? ;; # # coshell eval # e|ev|eva|eval) shift local cookie=$RANDOM if (( $# == 0 )) ; then echo "coshell eval: no argumentsl" >&2 return 1 fi if [ x$coprocess_pid = x ] ; then echo "coshell eval: no active coshell" >&2 return 1 fi coprocess print "$@" coprocess print "coprocess_rc=\$?" coprocess print "printf 'coprocess-$cookie----\n%d\n' \$coprocess_rc" if [ x$coprocess_pid = x ] ; then return 0 fi local ol while coprocess read ol ; do case "$ol" in *coprocess-$cookie----*) ol="${ol%coprocess-$cookie----}" echo -n "$ol" break ;; esac echo "$ol" done coprocess read ol return $ol ;; # # coshell sendfile # s|se|sen|send|sendf|sendfi|sendfil|sendfile) shift if (( $# != 2 )) ; then echo "coshell sendfile: syntax is 'coshell sendfile SRC TARGET'" >&2 return 1 fi if [ x$coprocess_pid = x ] ; then echo "coshell sendfile: no active coshell" >&2 return 1 fi local target=$2 if coshell test -d "$target" ; then target="$target/${1##*/}" fi coprocess print "uudecode <&2 return 1 fi if [ x$coprocess_pid = x ] ; then echo "coshell getfile: no active coshell" >&2 return 1 fi local target=$2 if test -d "$target" ; then target="$target/${1##*/}" fi coshell eval uuencode -m "$target" "<" "$1" |uudecode return $? ;; *) coshell eval "$@" return $? ;; esac shift done coprocess status return $? }