我创建了一个别名来保存使用 systemd 时的一些击键:
$ alias sctl='systemctl'
但是,这会破坏子命令的制表符补全。是否可以在不破坏制表符完成的情况下为命令添加别名?
答案1
首先找出该systemctl
命令使用了哪个完整功能:
complete | grep " systemctl$"
输出如下所示:
complete -F _functionname systemctl
然后使用:
complete -F _functionname sctl
来注册该函数来完成你的别名。
现在,当您键入 时,将会出现sctl <tab><tab>
与键入时相同的建议。systemctl
答案2
安装后这个工具,你可以这样做:
在
~/.bash_profile
:alias sctl='systemctl'
在
~/.bash_completion
:complete -F _complete_alias sctl
键入
sctl <tab>
以显示systemctl
命令:$ sctl <Tab> add-requires add-wants cancel cat condreload ...
答案3
我破解了这个,让完成也适用于 systemctl+args。我复制了 bash-completion 源代码的某些部分以供 systemctl 来管理(/usr/share/bash-completion/completions/systemctl)。
alias ssr='sudo systemctl restart'
alias sss='sudo systemctl status'
alias ssp='sudo systemctl stop'
# Load necessary functions in bash-completion's source code for systemctl (get_*_units)
source /usr/share/bash-completion/completions/systemctl
# Manually recreate some functions
_systemctl_status()
{
comps=$( __get_non_template_units --system "${COMP_WORDS[1]}" )
compopt -o filenames
COMPREPLY=( $(compgen -o filenames -W '$comps') )
return 0
}
_systemctl_restart()
{
comps=$( __get_restartable_units --system "${COMP_WORDS[1]}" )
compopt -o filenames
COMPREPLY=( $(compgen -o filenames -W '$comps') )
return 0
}
_systemctl_stop()
{
comps=$( __get_stoppable_units --system "${COMP_WORDS[1]}" )
compopt -o filenames
COMPREPLY=( $(compgen -o filenames -W '$comps') )
return 0
}
complete -F _systemctl_restart ssr
complete -F _systemctl_status sss
complete -F _systemctl_stop ssp
这可以轻松地扩展到其他 systemctl 命令,只需在源文件中查找正确的 get_*_units 命令并复制我的示例即可。
我还尝试修改 $COMP_WORDS 数组以获得适用于所有命令的通用解决方案,但无济于事。