#!/bin/bash PS4=$'+ L\t$LINENO:\t' case $- in *i* ) ;; *x* ) exec bash --init-file "$0" -i -x -s "$@" ;; * ) exec bash --init-file "$0" -i -s "$@" ;; esac set -mx source ./src/finally.bash burld_read() { while r=0; POSIXLY_CORRECT=y read -N1 -p '[hullo? burld?]> ' || r=$? do if (( r > 128 )) then sleep .25 continue elif [[ -n $REPLY ]] then echo "Burly ${REPLY:-Burld!}" return 0 else echo "read returned $r" >&2 return $r fi done return 1 } quiet_fg() { fg "$1" >/dev/null } quiet_bg() { local STDERR { eval "$(printf '%q ' "$@") 2>&$STDERR $STDERR>&- &" } {STDERR}>&2 2>/dev/null } ring0() { PS1="Burly ${SIGNAL:=bee}\\\$ " } lifetime() { [[ $$ != $BASHPID ]] && trap 'exit 0' INT sleep "$1" & if wait -f $! then kill "${@:2}" 2>/dev/null true else return $? fi } h() { quiet_bg sleep 5 jobs -x quiet_bg lifetime 3 -INT %% finally 'ring0' \ quiet_fg %sleep } # Does this work? g() { # lifetime 1 -INT $$ & { burld_read; kill -INT $$; : reached ; } & lifetime 3 -STOP $! & PROMPT_COMMAND='pcmd fg' fg } # Does this work? g() { # lifetime 1 $$ & { burld_read; kill -INT $$; : reached ; } & lifetime 3 -INT $$ & disown finally 'fg' eval 'sleep 3m & wait -f $!' } gn() { { burld_read; kill -INT $$; : reached ; } & lifetime 3 -TSTP $! & disown finally 'fg' fg } gp() { { burld_read; kill -INT $$; : reached ; } & trap "finally fg :" SIGINT lifetime 3 -INT $$ & disown # finally 'fg' fg } # Interrupting read that works f() { quiet_bg burld_read jobs -x quiet_bg lifetime 3 -INT %% finally 'ring0' \ quiet_fg %burld_read } pcmd() { if [ "$PROMPT_COMMAND" ] then PROMPT_COMMAND= "$@" else PROMPT_COMMAND="pcmd ${*@Q}" fi } ff() { quiet_bg burld_read jobs -x quiet_bg lifetime 3 -INT %% pcmd ring0 quiet_fg %burld_read } ring0gg() { kill -INT "$1" 2>/dev/null PS1="Burly ${SIGNAL:=bee}\\\$ " } gg() { quiet_bg burld_read jobs -x quiet_bg lifetime 3 -INT %% finally "ring0gg $!" \ quiet_fg %burld_read } DEBUG=y trap 'SIGNAL=INT; : SIGINT' INT PS1="[type 'f']\\\$ " case "$1" in '' ) ;; ff ) "$1" ;; * ) "$1" ;; esac