108 lines
1.7 KiB
Bash
108 lines
1.7 KiB
Bash
# coprocess.bash
|
|
#
|
|
# vi:set sts=2 sw=2 ai:
|
|
#
|
|
|
|
coprocess_pid=
|
|
|
|
#
|
|
# coprocess - Start, control, and end coprocesses.
|
|
#
|
|
function coprocess ()
|
|
{
|
|
while (( $# > 0 )) ; do
|
|
case "$1" in
|
|
#
|
|
# coprocess close
|
|
#
|
|
c|cl|clo|clos|close)
|
|
shift
|
|
exec 61>&- 62<&-
|
|
coprocess_pid=
|
|
if [ "$1" = "-SIGPIPE" ] ; then
|
|
# Only print message in an interactive shell
|
|
case "$-" in
|
|
*i*)
|
|
echo 'SIGPIPE' >&2
|
|
;;
|
|
esac
|
|
return 1
|
|
fi
|
|
return 0
|
|
;;
|
|
|
|
#
|
|
# coprocess open
|
|
#
|
|
o|op|ope|open)
|
|
shift
|
|
local fifo="/var/tmp/coprocess.$$.$RANDOM"
|
|
|
|
local cmd="/bin/bash"
|
|
if (( $# > 0 )) ; then
|
|
cmd="$@"
|
|
fi
|
|
|
|
mkfifo "$fifo.in" || return $?
|
|
mkfifo "$fifo.out" || {
|
|
ret=$?
|
|
rm -f "$fifo.in"
|
|
return $?
|
|
}
|
|
|
|
( "$@" <$fifo.in >$fifo.out ; rm -f "$fifo.in" "$fifo.out" ) &
|
|
coprocess_pid=$!
|
|
exec 61>$fifo.in 62<$fifo.out
|
|
return 0
|
|
;;
|
|
|
|
#
|
|
# coprocess print - write to the coprocess
|
|
#
|
|
p|pr|pri|prin|print)
|
|
shift
|
|
local old_trap=$(trap -p SIGPIPE)
|
|
trap 'coprocess close -SIGPIPE' SIGPIPE
|
|
if [ $# -eq 1 ] && [ "$1" = "--stdin" ] ; then
|
|
cat >&61
|
|
else
|
|
echo "$@" >&61
|
|
fi
|
|
local ret=$?
|
|
eval "$old_trap"
|
|
return $ret
|
|
;;
|
|
|
|
#
|
|
# coprocess read - read from the coprocess
|
|
#
|
|
r|re|rea|read)
|
|
shift
|
|
local old_trap=$(trap -p SIGPIPE)
|
|
trap '_coprocess_close -SIGPIPE' SIGPIPE
|
|
builtin read "$@" <&62
|
|
local ret=$?
|
|
eval "$old_trap"
|
|
return $ret
|
|
;;
|
|
|
|
s|st|sta|stat|statu|status)
|
|
if [ -z "$coprocess_pid" ] ; then
|
|
echo 'no active coprocess'
|
|
return 1
|
|
else
|
|
echo " coprocess is active [$coprocess_pid]"
|
|
return 0
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
coprocess print "$@"
|
|
return $?
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
coprocess status
|
|
return $?
|
|
}
|