bash - 为什么这个自动完成功能在 Linux 中不自动完成?

标签 bash ubuntu autocomplete

在我的 bashrc 中。我正在尝试 bash 如下完成命令 scp

function _scp_complete
{
  COMPREPLY=""
  COMPREPLY+=( $(cat ~/.ssh_complete ) )
  COMPREPLY+=( $( find . ! -name . -prune -type f ) )
}
complete -F _scp_complete scp

我的想法是,当按下 scp [tab] 时,我会看到当前目录中的所有文件以及文本文件 ~/.ssh_complete 中列出的单词。假设此文件包含以下条目:

亚历克斯@192.0.0.1 亚历克斯@192.0.0.2

所需的行为如下:我键入 scp alex@[TAB] 并按 Tab 完成“完成”命令到 scp alex@192.0.0。自动执行,因为只有两个可能的参数以 alex@ 开头(假设当前工作目录中没有类似命名的文件。):

>scp alex@[TAB]
  alex@192.0.0.1 alex@192.0.0.1 
>scp alex@192.0.0.

我通过所描述的实现获得的行为如下:我键入 scp alex@[TAB] 并且 Tab 完成没有完成任何事情,但列出了所有可能的命令下面的参数:

>scp alex@[TAB]
  alex@192.0.0.1 alex@192.0.0.1 file1 Music Pictures ./.emacs <ALL files in the current directory>
>scp alex@

如何修复函数以获得所需的行为?

最佳答案

您需要使用 COMP_WORDS数组以获取已键入的当前单词。然后使用 compgen命令根据您的原始单词列表生成可能的补全。

尝试以下操作:

_scp_complete()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W "$(< ~/.ssh_complete) $( find . ! -name . -prune -type f )" -- $cur) )
}
complete -F _scp_complete scp

查看此博文了解更多详情:Writing your own Bash Completion Function

请注意,我认为此补全不适用于名称中包含空格的文件。

另请注意,而不是 $(cat file) , 使用 $(< file) 效率更高从文件中提取文本。

关于bash - 为什么这个自动完成功能在 Linux 中不自动完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14723557/

相关文章:

Linux:WGET - 使用 -i 选项时缺少方案

linux - 删除文件名开头带有数字的文件

linux - 安装 Apache Spot

javascript - 选择选项时 dataList 自动填充其他字段 - AngularJs

jQuery 和原型(prototype)冲突

bash - 为什么我不将 shell 命令的结果保存到我的变量中?

bash - 如何在 bash 函数参数中引用?

bash - 在 BASH/SHELL 中捕获输出和退出代码

发送文件后,Ubuntu 上的 Git 通过 HTTP(不是 HTTPS)推送挂起

html - 如何在 PHPStorm 中禁用 html 标记完成