7

I tried

alias sct='systemctl'
complete -F _systemctl sct

But the function _systemctl is not found until I run the original command systemctl in the session. This function loads dynamically or somehow and contains many other same functions inside.

OS - Ubuntu 20.04

3 Answers 3

8

Create a file named /etc/bash_completion.d/systemctl:

if [[ -r /usr/share/bash-completion/completions/systemctl ]]; then
    . /usr/share/bash-completion/completions/systemctl && complete -F _systemctl systemctl sct
fi

You can restart bash-completion by sourcing . /etc/bash_completion

1
  • 1
    I had been wondering about this for some time - thanks for a good solution. ;-) Oct 22, 2021 at 7:47
3

I found a file with autocomplete functions for systemctl in my system and added a line to load it:

source /usr/share/bash-completion/completions/systemctl
alias sct='systemctl'
complete -F _systemctl sct
5
  • where did you put it?
    – user986805
    Oct 22, 2021 at 6:44
  • @bac0n In the terminal. Or in ~/.bashrc file in my case.
    – tehkonst
    Oct 22, 2021 at 6:55
  • no need for an alias.
    – user986805
    Oct 22, 2021 at 7:02
  • I thought so, but somehow it didn't work.
    – tehkonst
    Oct 22, 2021 at 7:03
  • 1
    yep wrong of me.
    – user986805
    Oct 22, 2021 at 7:12
2

Just

alias sct='systemctl'
_completion_loader systemctl
complete -F _systemctl sct

But I recommend use bash function instead of bash alias so you can define some shortcuts for sub commands, here is an example:

sct ()
{
    case $1 in
        e)
            shift;
            sudo systemctl enable --now "$@"
        ;;
        d)
            shift;
            sudo systemctl disable --now "$@"
        ;;
        s)
            shift;
            systemctl status "$@"
        ;;
        S)
            shift;
            sudo systemctl stop "$@"
        ;;
        r)
            shift;
            sudo systemctl restart "$@"
        ;;
        *)
            systemctl "$@"
        ;;
    esac
}

In addition, in order to make bash completion work for these shortcuts, you need to add them to array VERBS in corresponding keys in /usr/share/bash-completion/completions/systemctl. Here is an example for sct e :

    local -A VERBS=(
        ...
-       [DISABLED_UNITS]='enable'
+       [DISABLED_UNITS]='enable e'
        ...
    )

But these modifications in /usr/share/bash-completion/completions/systemctl may lost over an update. I haven't found a perfect way to override it yet, maybe later.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.