Ticket #20553: launchctl

File launchctl, 5.5 KB (added by mklein-de (Michael Klein), 15 years ago)
Line 
1# ex: filetype=sh et sw=4
2#
3# launchctl(1) completion
4#
5have launchctl &&
6{
7_launchctl()
8{
9    local cur oslevel
10
11    oslevel=${OSTYPE//darwin/}
12    oslevel=${oslevel%%.*}
13
14    COMPREPLY=()
15    cur=`_get_cword`
16
17    if [[ $COMP_CWORD -eq 1 ]]; then
18        local commands
19
20        commands="load unload start stop list setenv unsetenv \
21            getenv export limit shutdown getrusage log umask help"
22
23        if [[ $oslevel -le 8 ]]; then
24            commands+=" reloadttys stdout stderr"
25        fi
26
27        if [[ $oslevel -ge 9 ]]; then
28            commands+=" submit remove bootstrap singleuser bsexec bslist"
29            if [[ $oslevel -ge 10 ]]; then
30                commands+=" bstree managerpid manageruid managername"
31            fi
32        fi
33        COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
34    else
35        local command
36        command=${COMP_WORDS[1]}
37        prev=${COMP_WORDS[COMP_CWORD-1]}
38
39        case "$command" in
40            load|unload)
41                case $prev in
42                    -S)
43                        COMPREPLY=( $( compgen -W "Aqua LoginWindow Background StandardIO System" -- $cur ) )
44                    ;;
45                    -D)
46                        COMPREPLY=( $( compgen -W "system local network all user" -- $cur ) )
47                    ;;
48                    *)
49                        opts="-w"
50                        if [[ $oslevel -ge 0 ]]; then
51                            opts+=" -S -D"
52                            if [[ $command = load ]]; then
53                                opts+=" -F"
54                            fi
55                        fi
56                        COMPREPLY=( $( compgen -f -W "$opts" -- $cur ) )
57                    ;;
58                esac
59            ;;
60            start|stop|remove|list)
61                local jobs opts
62
63                if [[ $command != list || $oslevel -ge 9 ]]; then
64                    if [[ $oslevel -le 8 ]]; then
65                        jobs="$( launchctl list )"
66                    else
67                        jobs="$( launchctl list | awk 'NR>1 { print $3 }')"
68                        if [[ $oslevel -ge 10 && $command = list ]]; then
69                            opts="-x"
70                        fi
71                    fi
72                fi
73                COMPREPLY=( $( compgen -W "$jobs $opts" -- $cur ) )
74            ;;
75            getenv|setenv|unsetenv)
76                if [[ $COMP_CWORD -eq 2 ]]; then
77                    envvars="$( launchctl export | cut -f1 -d= )"
78                    COMPREPLY=( $( compgen -W "$envvars" -- $cur ) )
79                fi
80            ;;
81            getrusage)
82                if [[ $COMP_CWORD -eq 2 ]]; then
83                    COMPREPLY=( $( compgen -W "self children" -- $cur ) )
84                fi
85            ;;
86            limit)
87                if [[ $COMP_CWORD -eq 2 ]]; then
88                    local limits
89                    limits="$( launchctl limit | awk '{print $1}' )"
90                    COMPREPLY=( $( compgen -W "$limits" -- $cur ) )
91                fi
92            ;;
93            log)
94                if [[ $COMP_CWORD -eq 2 ]]; then
95                    COMPREPLY=( $( compgen -W "level only mask" -- $cur ) )
96                else
97                    local level
98                    levels="debug info notice warning error critical alert emergency"
99                    case ${COMP_WORDS[2]} in
100                        level)
101                            if [[ $COMP_CWORD -eq 3 ]]; then
102                                COMPREPLY=( $( compgen -W "$levels" -- $cur ) )
103                            fi
104                        ;;
105                        mask|only)
106                            COMPREPLY=( $( compgen -W "$levels" -- $cur ) )
107                        ;;
108                    esac
109                fi
110            ;;
111            stdout|stderr)
112                # Darwin 8 only
113                if [[ $oslevel -le 8 ]]; then
114                    _filedir
115                fi
116            ;;
117            submit)
118                local i
119                i=1
120                while [[ $i -lt ${#COMP_WORDS[@]} ]]; do
121                    if [[ "${COMP_WORDS[i-1]}" = "--" ]]; then
122                        _command_offset $i
123                        return 0
124                    fi
125                    i=$((i+1))
126                done
127
128                local submit_opts
129                submit_opts="-l -p -o -e --"
130                case $prev in
131                    -l)
132                    ;;
133                    -p)
134                        _command_offset $COMP_CWORD
135                    ;;
136                    -o|-e)
137                        _filedir
138                    ;;
139                    *)
140                        COMPREPLY=( $( compgen -W "$submit_opts" -- $cur ) )
141                    ;;
142                esac
143
144            ;;
145            bslist)
146                local pids opts
147                pids=$( ps axo pid= )
148                [[ $oslevel -ge 10 ]] && opts="-j"
149                COMPREPLY=( $( compgen -W "$pids $opts" -- $cur ) )
150            ;;
151            bsexec)
152                if [[ $COMP_CWORD -eq 2 ]]; then
153                    local pids
154                    pids=$( ps axo pid= )
155                    COMPREPLY=( $( compgen -W "$pids" -- $cur ) )
156                else
157                    _command_offset 3
158                fi
159            ;;
160            bstree)
161                if [[ $oslevel -ge 10 ]]; then
162                    COMPREPLY=( $( compgen -W "-j" -- $cur ) )
163                fi
164                ;;
165        esac
166    fi
167
168    return 0
169}
170complete -F _launchctl $filenames launchctl
171}