bash - 用“@”符号完成的 Bash
问题描述
我正在尝试为 scp 创建一个自动完成脚本。该脚本从我的 .ssh/config 文件中读取用户名和主机名 我的 .ssh/config 文件如下所示:
Host host1
HostName host1
User userA
port 22
Host host2
HostName host2
User userB
port 22
Host host3
HostName host3
User userB
port 22
我的 .autocomplete_scp.sh 文件是:
# SSH
function _scp_completion() {
pcregrep -o -M 'HostName [a-zA-Z.]+[\n\t\s]+User [a-zA-Z]+'
$HOME/.ssh/config | awk 'NR % 2 == 1 { o=$2 ; next } { print $2"@"o}'
}
complete -W "$(_scp_completion)" scp
我在我的 bashrc 中获取这个文件。
现在当我键入userA
并按下Tab时,自动完成功能会给我userA@host1
。当我键入userB
并点击Tab时,自动完成功能会给我userB@
,但我无法获得完整的字符串(userB@host2
或userB@host3
)。
userA@h
当我键入并按Tab两次按钮时,它也不起作用。@
所以它似乎因为标志而卡住了。(当我@
从 _scp_completion 函数中删除符号时,它工作正常。)
有什么想法可以解决这个问题吗?谢谢!
解决方案
使其工作的简单方法是删除'@'
或$COMP_WORDBREAKS
Bash 将@
自行处理。你可以这样尝试:
COMP_WORDBREAKS=${COMP_WORDBREAKS//@}
complete -W 'userA@host1 userB@host2 userB@host3' scp
根据 bash 文档:
COMP_WORDBREAKS
readline库在执行单词完成时将其视为单词分隔符的字符集。
推荐阅读
- javascript - JavaScript - 延迟加载图像后备不会出现在 iOS11 Safari 上
- java - spring ThreadPoolTaskScheduler 不使用 Instant 运行计划
- reactjs - React - 将可编辑的工具提示添加到 div 中突出显示的文本
- kubernetes - 如何使用 GKE 自动扩缩
- node.js - 尝试在 kubernetes 上运行 ui (app) 时出错?
- azure - 使用 AKS 进行事件网格验证
- flutter - Flutter:如何设置 SliverAppBar 默认折叠
- java - PKIX 路径构建在 Java 7 中失败,但在 Java 8 中失败 - 尽管拥有浏览器信任的 Let's Encrypt 证书,但无法连接到我的 HTTPS 服务器
- r - 在 ggBoxplot 中标记异常值
- batch-file - 如何只访问一个额外的子目录并使用批处理访问他们的文件?