如何使用自动完成功能为 systemctl 创建别名

如何使用自动完成功能为 systemctl 创建别名

我试过

alias sct='systemctl'
complete -F _systemctl sct

但是直到我在会话中运行原始命令 systemctl 时才找到函数 _systemctl。此函数以动态或以某种方式加载,并且内部包含许多其他相同的函数。

操作系统-Ubuntu 20.04

答案1

创建一个名为的文件/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

您可以通过以下方式重新启动 bash-completion:. /etc/bash_completion

答案2

我在我的系统中找到了一个具有 systemctl 自动完成功能的文件,并添加了一行来加载它:

source /usr/share/bash-completion/completions/systemctl
alias sct='systemctl'
complete -F _systemctl sct

答案3

只是

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

但是我建议使用 bash 函数而不是 bash 别名,这样您就可以为子命令定义一些快捷方式,这里有一个示例:

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
}

此外,为了使 bash 能够对这些快捷键进行补全,你需要将它们添加到VERBS中对应键的数组中/usr/share/bash-completion/completions/systemctl。以下是 的示例sct e

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

但这些修改/usr/share/bash-completion/completions/systemctl可能会在更新后丢失。我还没有找到完美的方法来覆盖它,也许以后吧。

相关内容