# fio(1) completion -*- shell-script -*- _comp_cmd_fio__compgen_engines() { _comp_compgen_split -F $'\t\n' -- "$("$1" --enghelp 2>/dev/null | command sed -ne '/^[[:space:]]/p')" } _comp_cmd_fio() { local cur prev words cword was_split comp_args _comp_initialize -s -- "$@" || return local REPLY case $prev in --help | --version) return ;; --debug) local opts=$("$1" --debug=help 2>/dev/null) opts=${opts##*:} _comp_delimited , -W "${opts//,/ }" return ;; --output-format) _comp_compgen -- -W "terse json json+ normal" return ;; --terse-version) _comp_compgen -- -W "2 3 4 5" return ;; --crctest) _comp_compgen_split -- "$("$1" --crctest=nonexistent 2>/dev/null)" return ;; --cmdhelp) _comp_compgen_split -- "$("$1" --cmdhelp=all 2>/dev/null | _comp_awk '{print $1}') all" return ;; --enghelp) _comp_cmd_fio__compgen_engines "$1" return ;; --eta) _comp_compgen -- -W "always never auto" return ;; --daemonize) _comp_compgen_filedir pid return ;; --client) _comp_compgen_known_hosts -- "$cur" return ;; --remote-config) _comp_compgen_filedir '@(fio|job)' return ;; --idle-prof) _comp_compgen -- -W "system percpu calibrate" return ;; --inflate-log) _comp_compgen_filedir log return ;; --trigger-file) _comp_compgen_filedir return ;; --trigger | --trigger-remote) _comp_compgen_commands return ;; --aux-path) _comp_compgen_filedir -d return ;; --ioengine) _comp_cmd_fio__compgen_engines "$1" return ;; --exec_postrun | --exec_prerun) _comp_compgen_commands return ;; --uid) _comp_compgen_uids return ;; --gid) _comp_compgen_gids return ;; --?*) local -a cmdhelp _comp_split -l cmdhelp "$("$1" --cmdhelp="${prev#--}" 2>/dev/null)" case ${cmdhelp[*]-} in *"showing closest match"*) # ignore ;; *" type: boolean "* | *" type: empty or boolean "*) _comp_compgen -- -W '0 1' return ;; *" valid values:"*) # For example, for --kb_base=: # valid values: 1024 [...] # : 1000 [...] local line="" in_values="" REPLY=() for line in "${cmdhelp[@]}"; do if [[ $in_values ]]; then if [[ $line =~ ^[[:space:]]*:[[:space:]]*([^[:space:]]+) ]]; then REPLY+=("${BASH_REMATCH[1]}") else break fi elif [[ $line =~ ^[[:space:]]*valid\ values:[[:space:]]*([^[:space:]]+) ]]; then in_values=set REPLY+=("${BASH_REMATCH[1]}") fi done _comp_compgen -- -W '"${REPLY[@]}"' return ;; esac # else fallthrough ;; esac [[ $was_split ]] && return if [[ $cur == -* ]]; then _comp_compgen_help _comp_compgen -a split -- "$("$1" --cmdhelp=all 2>/dev/null | _comp_awk '{printf "--%s=\n", $1}')" [[ ${COMPREPLY-} == *= ]] && compopt -o nospace return fi _comp_compgen_filedir '@(fio|job)' } && complete -F _comp_cmd_fio fio # ex: filetype=sh