首页 > 解决方案 > bash 自动完成功能可以与内置的“source”命令一起使用吗?

问题描述

我有一个项目,我会定期切换不同版本的库。我有一个脚本set_lib,它将库版本作为输入,然后设置相关的环境变量。有时我想获取这个脚本并手动构建/运行东西。我知道如何为函数/脚本配置自动完成功能,但是对于采购脚本呢?那是

>source set_lib v<tab><tab>
ver1 ver2 ver3

另外,我想source在不与set_lib.

编辑:正如建议的那样,我尝试了以下

_comp_set_lib() {
    if [ ${COMP_WORDS[1]} == 'set_lib' ]; then
        COMPREPLY=( "set_lib ver1" "set_lib ver2" )
    fi
}
complete -o bashdefault -F _comp_set_lib source

$COMP_CWORD作为第二个位置给我带来了问题。以上没有按预期工作并给了我

>source set_lib <tab>
source set_lib ver

标签: bash

解决方案


我认为最方便的方法是定义一个包装函数source set_lib ...

function set_lib() {
  source set_lib "$@"
}

然后为该功能设置自动完成。

但是,如果您更喜欢键入source set_lib而不仅仅是set_lib,那么您可以将自动完成函数附加到source内置函数,并在决定是否返回任何自定义匹配项之前检查"${COMP_WORDS[1]}"(意味着 的第一个参数source)是否等于。set_lib(当使用complete内置设置自动完成时,使用-o bashdefault标志告诉它,如果您的函数没有返回任何匹配项,那么您希望 Bash 回退到其默认逻辑以获取建议。)


推荐阅读