1

在我的 .bashrc 中。我正在尝试scp按如下方式完成命令

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

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

alex@192.0.0.1 alex@192.0.0.2

所需的行为如下:我键入scp alex@[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]并且制表符完成没有完成任何事情,但在命令下方列出了每个可能的参数:

>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@

如何修复该功能以获得所需的行为?

4

1 回答 1

1

您需要使用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

查看这篇博文了解更多详细信息:编写自己的 Bash 完成函数

请注意,我认为此完成不适用于名称中带有空格的文件。

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

于 2013-02-06T09:06:32.143 回答