Linux下命令补全工具bash-completion

段干安和
2023-12-01

Linux下超强的命令补全工具bash-completion

编写 Bash 补全脚本
参考URL: https://kodango.com/bash-competion-programming

在使用bash命令行时,在提示符下输入某个命令的前面几个字符,然后按下TAB键,就会列出以这几个字符开头的命令供我们选择。

自动补全这个功能是Bash自带的,但一般我们会安装bash-completion包来得到更好的补全效果,这个包提供了一些现成的命令补全脚本,一些基础的函数方便编写补全脚本,还有一个基本的配置脚本。

安装

yum install -y  bash-completion

编写自动补全脚本

大致原理,一般会有一个名为bash_completion的脚本,这个脚本会在shell初始化时加载。如对于RHEL系统来说,这个脚本位于/etc/bash_completion,而该脚本会由/etc/profile.d/bash_completion.sh中导入

在bash_completion脚本中会加载/etc/bash_completion.d下面的补全脚本

if [[ $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR && \
    -d $BASH_COMPLETION_DIR && -r $BASH_COMPLETION_DIR && \
    -x $BASH_COMPLETION_DIR ]]; then
    for i in $(LC_ALL=C command ls "$BASH_COMPLETION_DIR"); do
        i=$BASH_COMPLETION_DIR/$i
        [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)|Makefile*) \
            && -f $i && -r $i ]] && . "$i"
    done
fi
unset i

补全脚本的名称一般就是命令名,这样比较容易查找:

cd /etc/bash_completion.d
[root@VM_0_14_centos bash_completion.d]# ls
git  iprutils  redefine_filedir  scl.bash  yum-utils.bash

内置补全命令

Bash内置有两个补全命令,分别是compgen和complete。compgen命令根据不同的参数,生成匹配单词的候选补全列表,例如:

[root@VM_0_14_centos bash_completion.d]# compgen -W 'hi hello how world' h
hi
hello
how

compgen最常用的选项是-W,通过-W参数指定空格分隔的单词列表。h即我们在命令行当前键入的单词,执行完后会输出候选的匹配列表,这里是以h开头的所有单词。

complete命令的参数有点类似compgen,不过它的作用是说明命令如何进行补全,例如同样使用-W参数指定候选的单词列表:

我们还可以通过-F参数指定一个补全函数:

$ complete -F _foo foo

现在键入foo命令后,会调用_foo函数来生成补全的列表,完成补全的功能,这一点正是补全脚本实现的关键所在。

demo:

#!/usr/bin/env bash
_cli_bash_autocomplete() {
     local cur opts base;
     COMPREPLY=();
     cur="${COMP_WORDS[COMP_CWORD]}";
     opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-completion );
     COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) );
     return 0;
};
complete -F _cli_bash_autocomplete lotus

一般补全函数(这里_cli_bash_autocomplete)都会定义以下两个变量
cur 其中cur表示当前光标下的单词
opts 其中opts表示选项

初始化相应的变量后,我们需要定义补全行为,即输入什么的情况下补全什么内容。

 类似资料: