首页 > 解决方案 > Bash 仅从头开始完成(^...$)?

问题描述

我编写了一个简单的 bash 完成脚本来完成列表中的 ssh 服务器名,例如:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(cat $hosts | awk -F';' '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

$opts 列表是这样的:

locationX-apache-01.local.lan
locationY-apache-02.local.lan
locationX-mysql-01.local.lan
locationY-mysql-02.local.lan

如果我写例如,bash 完成按预期工作$ ssh loca<TAB>......但是如果我不从头开始这样我怎么能得到建议: $ ssh apac<TAB>从上面的列表中获取 2 个 apache 服务器:

locationX-apache-01.local.lan
locationY-apache-02.local.lan

标签: bashbash-completion

解决方案


尝试以下操作:

: ${cur:="."}
COMPREPLY=( $( grep "$cur" "$hosts"  | awk -F';' '{print $2}' ) )

第一行将 cur 设置为 "." (正则表达式通配符)以防未设置。然后我们只需在 $hosts 文件中查找任何匹配的字符串。最终用户对功能的感觉会有些不同,但我认为这会给你想要的东西。

将我的编辑与您的代码相结合,您将获得:

_ssh() 
{
    local cur 
    cur="${COMP_WORDS[COMP_CWORD]}"
    : ${cur:="."}
    COMPREPLY=( $( grep "$cur" "$hosts"  | awk -F';' '{print $2}' ) )

    return 0
}
complete -F _ssh ssh

推荐阅读