当我添加这一行时,它可以工作:
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中至少执行一次tab-completion之后.所以,如果我在新shell中直接运行scp_using_rsync,我会得到_scp not found错误.
在为ssh或scp命令尝试制表符完成之前和之后,新shell中的typeset -F输出清楚地表明在第一次尝试制表符完成后定义了以下函数:
$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链接到scp的bash完成?
New complete/compgen/compopt -D option to define a `default’ completion:
a completion to be invoked on command for which no completion has been
defined. If this function returns 124,programmable completion is
attempted again,allowing a user to dynamically build a set of completions
as completion is attempted by having the default completion function
install individual completion functions each time it is invoked.
bash的手册有一个例子:
_completion_loader() { . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124 } complete -D -F _completion_loader