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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
# bash completion for strace -*- shell-script -*-
_comp_cmd_strace()
{
local cur prev words cword comp_args
_comp_initialize -n = -- "$@" || return
# check if we're still completing strace
local offset=0 i
for ((i = 1; i <= cword; i++)); do
case ${words[i]} in
-o | -e | -p)
((i++))
continue
;;
-*)
continue
;;
esac
offset=$i
break
done
if ((offset > 0)); then
_comp_command_offset $offset
else
case $prev in
-*e)
if [[ $cur == *=* ]]; then
prev=${cur/=*/}
cur=${cur/*=/}
case $prev in
trace)
# Import arch-specific syscalls
#+ -- not foolproof IMHO --David Paleino
local define syscall rest
local -A syscalls
while read -r define syscall rest; do
[[ $define == "#define" &&
$syscall =~ ^__NR_(.+) ]] &&
syscalls[${BASH_REMATCH[1]}]=set
done 2>/dev/null </usr/include/asm/unistd.h
if ((${#syscalls[@]} == 0)); then
local unistd arch=$(command uname -m)
if [[ $arch == *86 ]]; then
unistd=/usr/include/asm/unistd_32.h
else
unistd=/usr/include/asm/unistd_64.h
fi
while read -r define syscall rest; do
[[ $define == "#define" &&
$syscall =~ ^__NR_(.+) ]] &&
syscalls[${BASH_REMATCH[1]}]=set
done 2>/dev/null <$unistd
fi
_comp_compgen -- -W \
'${syscalls[@]+"${!syscalls[@]}"} file process
network signal ipc desc all none'
return
;;
esac
else
compopt -o nospace
_comp_compgen -- -S"=" -W 'trace abbrev verbose raw signal
read write'
fi
return
;;
-*o)
_comp_compgen_filedir
return
;;
-*p)
_comp_compgen_pids
return
;;
-*S)
_comp_compgen -- -W 'time calls name nothing'
return
;;
-*u)
_comp_compgen_allowed_users
return
;;
esac
if [[ $cur == -* ]]; then
_comp_compgen_help -- -h
else
_comp_compgen_commands
fi
fi
} &&
complete -F _comp_cmd_strace -o default strace
# ex: filetype=sh
|