我添加了一个新的别名scp_using_rsync
,它使用rsync通过SSH将文件复制到特定选项。我想把scp的bash完成连接到这个别名。bash完成 - 在第一次调用命令时定义的完成功能
它的工作原理,当我加入这一行:
complete -o bashdefault -o default -o nospace -F _scp scp_using_rsync 2>/dev/null || complete -o default -o nospace -F _scp scp_using_rsync
唯一的问题是,我注意到,_scp
获取我的bash环境中定义,只有当我尝试至少一次制表完成与SSH/SCP那个外壳。所以如果我直接在新shell中运行scp_using_rsync
,我会得到_scp
找不到的错误。
从typeset -F
在之前一个新的外壳,并试图为ssh或scp命令选项卡完成后,该输出清楚地表明了以下功能在尝试首次制表完成后定义:
$ diff ~/.scratch/file1 ~/.scratch/file2
224a225,227
> declare -f _scp
> declare -f _scp_local_files
> declare -f _scp_remote_files
226a230
> declare -f _sftp
230a235,240
> declare -f _ssh
> declare -f _ssh_ciphers
> declare -f _ssh_macs
> declare -f _ssh_options
> declare -f _ssh_suboption
> declare -f _ssh_suboption_check
这些功能似乎在我的系统中定义在/usr/share/bash-completion/completions/ssh
。
这是我的2间相关的问题:
- 如何bash的身影从哪里自动拾取的定义,并定义它们的时候完成的尝试,第一次?
- 我应该如何将
scp_using_rsync
的bash完成以类似的方式链接到scp的bash完成?
链接到bash的手册:[Programmable Completion](http:// www。 gnu.org/software/bash/manual/bashref.html#Programmable-Completion) – pynexj 2013-04-07 05:14:30
哇!不知道bash有一个选项可以即时加载新的完成。你是对的,我看到'/ usr/share/bash-completion/bash_completion'中定义了'_completion_loader()'函数,这似乎是源于'/ usr/share/bash-completion/bash_completion'中的所有文件,因此ssh/scp的完成会被加载。甜! :)我认为对于我的用例,我会覆盖并定义自己的完成加载器来定义预期的完成,然后在bash完成中调用它。 – Tuxdude 2013-04-07 05:16:45