| # 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 $? |
| } |