首页 > 解决方案 > 用“@”符号完成的 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@host2userB@host3)。

userA@h当我键入并按Tab两次按钮时,它也不起作用。@所以它似乎因为标志而卡住了。(当我@从 _scp_completion 函数中删除符号时,它工作正常。)

有什么想法可以解决这个问题吗?谢谢!

标签: bashautocompletescpbash-completion

解决方案


使其工作的简单方法是删除'@'$COMP_WORDBREAKSBash 将@自行处理。你可以这样尝试:

COMP_WORDBREAKS=${COMP_WORDBREAKS//@}
complete -W 'userA@host1 userB@host2 userB@host3' scp

根据 bash 文档:

COMP_WORDBREAKS

readline库在执行单词完成时将其视为单词分隔符的字符集。


推荐阅读