bash - 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
解决方案
尝试以下操作:
: ${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
推荐阅读
- android - 我正在尝试从字符串中的数据库中提取数据
- javascript - 先前完成后循环中的 axios 请求
- javascript - POST 请求:如何从表单中读取 req.body
- sql - 将 SQL 表中的一系列值替换为单个值
- git - Git 服务器恢复丢失 30 天从本地 repo 恢复提交
- c++ - 将 carray 转换为 istream 的 initializer_list
- kotlin - 如何通过反射访问和更改 kotlin 中对象内的对象成员的字段值?
- r - 使用正则表达式更改列表中数据框的元素名称
- python-3.x - df.to_excel 仅捕获迭代 pandas 的最后一个请求
- amazon-web-services - AWS EC2 中的 JSF Websocket 在 localhost 但不在 EC2 (AWS) 上工作