summaryrefslogtreecommitdiff
path: root/src/hijack-prompt.bash
blob: f41dd1771acd71559d3f908f1b3f80741a4d7010 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/bin/bash
case $- in
        *i* )
                set -m
        ;;
        * )
                exec bash --init-file "$0" -i "$@"
        ;;
esac

unhijack()
{
        case $# in
                0 )
                        exec \
                                0<&$HIJACK_0 \
                                1>&$HIJACK_1 \
                                2>&$HIJACK_2 \
                                {HIJACK_0}<&- \
                                {HIJACK_1}>&- \
                                {HIJACK_2}>&-
                ;;
                * )
                        echo "history -d -1; unhijack; ${*@Q}"
                ;;
        esac
}

finally()
{
        exec \
                {HIJACK_0}<&0 \
                {HIJACK_1}>&1 \
                {HIJACK_2}>&2 \
                0< <(unhijack eval "$1") \
                &> /dev/null
        {
                "${@:2}"
        } <&$HIJACK_0 >&$HIJACK_1 2>&$HIJACK_2
}

burld_read()
{
        sleep 1
        read -p '[hullo?  burld?]> '
        echo "Burly ${REPLY:-Burld!}"
}

quiet_fg()
{
        fg "$1" >/dev/null
}

quiet_bg()
{
        local STDERR
        {
                eval "$(printf '%q ' "$@") 2>&\$STDERR {STDERR}>&- &"
        } {STDERR}>&2 2>/dev/null
}

ring0()
{
        PS1="Burly boo\\\$ "
}

f()
{
        quiet_bg burld_read
        finally 'ring0' \
                quiet_fg burld_read
}

PS1="[type 'f']\\\$ "