Linux bash completions for ccontrol/csession

I want to show my script which I use for a completion in bash, for ccontrol and csession. 

With this script bash helps to available (running or down) instances to ccontrol, or in csession

file
/usr/share/bash-completion/completions/ccontrol

# bash completions for InterSystems ccontrol

_instances() 
{
    if [ $# == 0 ] || [ $1 == "all" ]; then
        echo $(ccontrol qlist | cut -d'^' -f1 | tr '\n' ' ')
    else 
        echo $(ccontrol qlist | grep "\^$1\," | cut -d'^' -f1 | tr '\n' ' ')
    fi
}

_ccontrol()
{
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"

    commands="start stop force backup stat create update delete rename default view list qlist all qall nodename session version help"
    
    if [[ ${COMP_CWORD} == 1 ]] ; then
        COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
        return 0 
    fi

    command="${COMP_WORDS[1]}"

    parameters=""
    case "${command}" in 
        start)
            instances=$(_instances down)
            parameters="quietly nostu help"
            ;;
        stop)
            instances=$(_instances running)
            parameters="quietly nouser bypass restart nofailover help"
            ;;
        force)
            instances=$(_instances running)
            parameters="quietly help"
            ;;
        backup)
            instances=$(_instances running)
            parameters="quietly help"
            ;;
        stat)
            instances=$(_instances running)
            parameters="-h -? "
            ;;
        create)
            instances="NEWINSTANCE"
            parameters="directory= versionid="
            ;;
        update)
            instances=$(_instances all)
            parameters="versionid="
            ;;
        delete)
            instances=$(_instances all)
            parameters=""
            ;;
        rename)
            instances=$(_instances all)
            parameters="NEWNAME"
            ;;
        default)
            instances=$(_instances all)
            ;;
        view)
            instances=$(_instances all)
            ;;
        list)
            instances=$(_instances all)
            ;;
        qlist)
            instances=$(_instances all)
            ;;
        session)
            instances=$(_instances running)
            parameters="-B -U -b"
            if [[ ${COMP_CWORD} > 3 ]] && [[ ${COMP_WORDS[COMP_CWORD-1]} == "-U" ]] ; then
                namespaces="USER SAMPLES %SYS"
                    COMPREPLY=( $(compgen -W "${namespaces^^}" -- ${cur^^}) )
                return 0
            fi
            ;;
        help) 
            COMPREPLY=( $(compgen -W "${commands}" -- ${cur}))
            return 0
            ;;
        *)
            return 0
            ;;
    esac

    if [[ ${COMP_CWORD} == 2 ]] ; then
        COMPREPLY=( $(compgen -W "${instances^^}" -- ${cur^^}))
    fi

    if [[ ${parameters} == "" ]] ; then 
        return 0
    fi

    if [[ ${COMP_CWORD} > 2 ]]; then 
        COMPREPLY=( $(compgen -W "${parameters}" -- ${cur}) )
    fi

    return 0
} 
complete -F _ccontrol ccontrol

and 
/usr/share/bash-completion/completions/csession

# bash completions for InterSystems csession

_csession()
{
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    
    if [[ ${COMP_CWORD} == 1 ]] ; then
        instances=`ccontrol qlist | grep running | cut -d'^' -f1 | tr '\n' ' '`
        COMPREPLY=( $(compgen -W "${instances^^}" -- ${cur^^}) )
        return 0 
    fi

    if [[ ${COMP_CWORD} == 2 ]] ; then
    parameters="-B -U -b"
        COMPREPLY=( $(compgen -W "${parameters}" -- ${cur}) )
    return 0
    fi

    if [[ ${COMP_CWORD} == 3 ]] ; then
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    if [[ ${prev} == "-U" ]] ; then
        namespaces="USER SAMPLES %SYS"
            COMPREPLY=( $(compgen -W "${namespaces^^}" -- ${cur^^}) )
        return 0
    fi
    return 0
    fi
} 
complete -F _csession csession

you may activate bash-completions, if you still had not activated yet, with this lines in your /etc/bashrc or ~/.bashrc file

# Use bash-completion, if available
[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \
    . /usr/share/bash-completion/bash_completion

more information about bash completion you can find here

Comments

Dmitry, thanks for sharing this info. Fix a typo: here

/usr/share/bash-completion/completions/ccontrol

# bash completions for InterSystems csession

it should be: /usr/share/bash-completion/completions/csession

Thank you Dmitry,

really an interesting example, I wasn't aware of this feature in bash.

Unfortunately it seems like I cannot use it 1-to-1 under MacOS, but I may try following some of the guides on how to make the Mac-bash completition-aware using "brew".