Linux的命令补全脚本

作者 : admin 本文共3627个字,预计阅读时间需要10分钟 发布时间: 2024-06-10 共2人阅读

linux命令补全脚本

Linux的命令补全脚本是一个强大且高效的工具,它能够极大地提高用户在命令行界面的工作效率。这种脚本通过自动完成部分输入的命令或参数,帮助用户减少敲击键盘的次数并降低出错率。接下来将深入探讨其工作原理、安装方式以及如何自定义这些脚本:

1. 工作原理
   – 在Linux系统中,命令补全是通过Bash Shell的特性来实现的。Bash Shell内置了补全机制,允许用户在输入命令时通过按下Tab键来激活补全功能。这个特性虽然基础,但是已经可以提供一定程度的命令补全。
   – Bash4之后的版本中,为了增强补全功能,引入了bash-completion软件包。该软件包提供了更为丰富的命令补全脚本和函数库,使得补全功能更加智能和用户友好。

2. 安装配置
   – 可以通过包管理器(如yum或apt)来安装bash-completion软件包。例如,使用yum的安装命令为`yum install -y bash-completion`。
   – 安装完成后,为了使补全功能生效,需要配置Bash Shell以加载补全脚本。这通常是通过编辑`/etc/profile.d/bash_completion.sh`文件来完成的。

3. 编写脚本
   – 补全脚本通常存放在`/etc/bash_completion.d/`目录下。每个脚本的名称通常与其补全的命令名称相对应,方便管理和查找。
   – 编写补全脚本时,可以使用Bash内置的compgen和complete命令。compgen用于生成候选补全列表,而complete则用于定义特定命令的补全行为。

4. 使用实例
   – 一个简单的补全脚本可能会定义一个补全函数,该函数使用compgen命令生成匹配当前已输入字符的单词列表,然后通过complete命令将此函数绑定到特定的命令上。
   – 对于更复杂的需求,比如多级补全,脚本可能需要根据不同的上下文(如已输入的命令和参数)来决定显示哪些补全选项。这可以通过结合COMP_WORDS、COMP_CWORD等Bash内置变量来实现。

5. 高级应用
   – 除了基本的命令和文件名补全外,bash-completion还支持参数和选项的补全。这对于快速选择命令的参数非常有用,尤其是当参数众多或者不易记忆时。
   – 对于软件开发者而言,bash-completion也提供了一种手段来为自定义脚本或程序创建补全脚本,从而提升最终用户的使用体验。

总结来说,Linux下的命令补全脚本不仅提高了命令输入的效率,还降低了操作的错误率。通过合理利用bash-completion软件包及其提供的脚本和函数库,用户可以享受到更智能、更便捷的命令行交互体验。

二 自定义命令补全脚本

为程序自定义Linux的命令补全脚本涉及到编写特定的shell脚本,以扩展或改进Bash的自动补全功能。这些脚本利用了Bash提供的内置命令和变量来生成匹配用户输入的补全候选列表。下面将具体探讨如何为程序创建自定义的补全脚本:

1. 理解基本概念
   – 内置命令与变量:为了编写自定义的补全脚本,需要了解`compgen`和`complete`这两个Bash内置命令,以及`COMP_WORDS`、`COMP_CWORD`和`COMPREPLY`等重要的系统参数。
   – 补全机制概述:Bash Shell自带的补全功能可以通过按下Tab键激活,而bash-completion软件包则提供了增强的补全支持,包括对自定义脚本的支持。

2. 准备环境
   – 安装bash-completion:如果尚未安装bash-completion,需要先通过包管理器进行安装。这个包包含了基本的补全框架和许多现成的补全脚本。
   – 确保加载补全脚本:确认Bash初始化时会加载bash-completion提供的主脚本,这通常在`/etc/profile.d/bash_completion.sh`中设置。

3. 编写补全脚本
   – 定义补全函数:创建一个补全函数,例如`_myprogram()`,在这个函数中,使用`compgen`命令根据用户的当前输入(由`$COMP_WORDS`和`$COMP_CWORD`表示)生成补全候选列表。
   – 使用local变量:在补全函数中,定义局部变量`cur`和`prev`来分别表示当前光标下的单词和前一个单词,这对于确定补全逻辑很重要。

4. 绑定补全函数
   – 应用complete命令:使用`complete`命令将定义好的补全函数绑定到特定的命令上。例如,`complete -F _myprogram myprogram`告诉Shell,当用户尝试补全`myprogram`命令时,应调用`_myprogram`函数。

5. 配置脚本位置
   – 保存脚本位置:将自定义的补全脚本保存在`/etc/bash_completion.d/`目录下,这样它就可以被bash-completion的主脚本自动发现和加载。

6. 测试验证
   – 测试补全功能:在实际环境中测试自定义的补全脚本,确保它能正确工作。可以尝试输入命令并按下Tab键,查看是否显示了预期的补全选项。

7. 高级应用
   – 处理复杂场景:对于更复杂的补全逻辑,比如需要根据不同的命令选项显示不同的补全列表,可以在补全函数中使用条件语句来实现。
   – 优化用户体验:为了使补全更加用户友好,可以考虑到补全速度、候选列表的显示格式和过滤算法等方面进行优化。

通过以上步骤,可以为Linux环境下的程序创建自定义的命令补全脚本,显著提升命令行工具的使用效率和用户体验。这不仅有助于减少命令输入的错误,还能加快日常工作的流程,特别是对于经常使用命令行操作的用户来说,这是一个非常有价值的功能。

三 举例

样例一:ninja的命令补全脚本:

# Add the following to your .bashrc to tab-complete ninja targets
#   . path/to/ninja/misc/bash-completion

_ninja_target() {
    local cur prev targets dir line targets_command OPTIND

    # When available, use bash_completion to:
    #   1) Complete words when the cursor is in the middle of the word
    #   2) Complete paths with files or directories, as appropriate
    if _get_comp_words_by_ref cur prev &>/dev/null ; then
        case $prev in
            -f)
                _filedir
                return 0
                ;;
            -C)
                _filedir -d
                return 0
                ;;
        esac
    else
        cur="${COMP_WORDS[COMP_CWORD]}"
    fi

    if [[ "$cur" == "--"* ]]; then
        # there is currently only one argument that takes --
	COMPREPLY=($(compgen -P '--' -W 'version' -- "${cur:2}"))
    else
	dir="."
	line=$(echo ${COMP_LINE} | cut -d" " -f 2-)
        # filter out all non relevant arguments but keep C for dirs
	while getopts :C:f:j:l:k:nvd:t: opt $line; do
	    case $opt in
                # eval for tilde expansion
		C) eval dir="$OPTARG" ;;
	    esac
	done;
	targets_command="eval ninja -C \"${dir}\" -t targets all"
	targets=$((${targets_command} 2>/dev/null) | awk -F: '{print $1}')
	COMPREPLY=($(compgen -W "$targets" -- "$cur"))
    fi
    return
}
complete -F _ninja_target ninja

_get_comp_words_by_ref是一个bash shell函数,用于获取当前命令行中的所有单词。它通过引用传递参数的方式返回一个数组,其中包含了当前命令行中的所有单词。

这个函数的实现通常如下所示:


_get_comp_words_by_ref() {
  local words=("${COMP_WORDS[@]}")
  printf "%s
" "${words[@]}"
}

样例二:


# 编辑文件内容
_mycommand() {
  local cur=${COMP_WORDS[COMP_CWORD]}
  local options="-a -b"
  COMPREPLY=($(compgen -W "${options}" -- ${cur}))
}

complete -F _mycommand mycommand

本站无任何商业行为
个人在线分享 » Linux的命令补全脚本
E-->