【问题标题】:Bash Completion only from beginning (^...$)?Bash 仅从头开始完成(^...$)?
【发布时间】:2021-11-08 17:32:59
【问题描述】:

我编写了一个简单的 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

如果我写 $ ssh loca<TAB> 的话,Bash 补全会按预期工作……但是如果我不从头开始,我怎么能得到建议: $ ssh apac<TAB> 从上面的列表中获取 2 个 apache 服务器:

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

【问题讨论】:

  • 不要忘记可能的ssh user@host。您需要将$cur 拆分为userhost 部分,匹配host,然后将user 附加到结果中。
  • 将您的主机放入您的.ssh/config 文件中,默认的 bash 补全将拾取并使用它们。

标签: bash bash-completion


【解决方案1】:

尝试以下方法:

: ${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

【讨论】:

  • 不幸的是,这似乎不是解决方案……我正在使用 zsh,有没有更好的 zsh 自动补全方法?
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多