我添加了一个新的 alias scp_using_rsync
,它使用 rsync 通过某些选项通过 SSH 复制文件。我想将 scp 的 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
只有在我在该 shell 中尝试使用 ssh/scp 至少一次完成制表符之后,才在我的 bash 环境中定义。所以如果我直接scp_using_rsync
在一个新的 shell 中运行,我会得到_scp
not found 错误。
在尝试 ssh 或 scp 命令的 tab 补全之前和之后的新 shell 中的输出typeset -F
清楚地表明,在第一次尝试 tab 补全之后定义了以下函数:
$ 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
在我的系统中定义的。
这些是我的两个相互关联的问题:
- 第一次尝试完成时,bash 如何确定在哪里自动获取定义并定义它们?
- 我应该如何
scp_using_rsync
以类似的方式将 bash-completion for 链接到 scp 的 bash 完成?