I've added a new alias scp_using_rsync
, which uses rsync to copy files over SSH with certain options. I wanted to link the bash completion for scp to this alias.
It works when I add this line:
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
The only problem is that I notice, _scp
gets defined in my bash environment, only after I try tab-completion with ssh/scp at least once in that shell. So if I directly run scp_using_rsync
in a new shell, I would get the _scp
not found error.
The output from typeset -F
in a new shell before and after trying tab completion for ssh or scp commands indicate clearly that the following functions get defined after trying tab-completion for the first time:
$ 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
These functions seem to be defined in /usr/share/bash-completion/completions/ssh
in my system.
These are my 2 inter-related questions:
- How does bash figure out where to pick up the definitions automatically and define them when the completion is tried for the first time ?
- How should I be linking the bash-completion for
scp_using_rsync
to scp's bash completion in a similar way ?
_completion_loader()
function defined in/usr/share/bash-completion/bash_completion
which seems to source all the files in/usr/share/bash-completion/bash_completion
and hence the completions for ssh/scp get loaded. Sweet! :) I think for my usage case, I'll override and define my own completion loader to define the intended completions, and then call the one in bash-completion. – Maund