在我的 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/