Удаленное автозаполнение Bash: измените каталог «запуск»

Я регулярно загружаю файлы с удаленного сервера, всегда из одного и того же каталога. Поэтому я написал пользовательскую функцию, которую я ввел в мой bashrc :

 download_from_myserver () { for file in "$@" do rsync myserver:/home/pierre/downloads/"$file" . done } 

Прямо сейчас автозаполнение работает по умолчанию с файлами в текущем каталоге. Я хотел бы изменить автозаполнение так, чтобы bash автоматически подключался к серверу через ssh и autocompletes с файлами, которые находятся в myserver:/home/pierre/downloads/ .

В случае, если я не понимаю, вот пример: допустим, у меня есть my_file.txt в удаленном каталоге, я хочу иметь возможность сделать это:

download_from_my_server my_fi TAB
download_from_my_server my_file.txt

Как мне это сделать?

Примечания. Я уже использую соединение без пароля, автозаполнение rsync и scp работают хорошо, это не проблема. Я использую Ubuntu на обеих машинах, если это важно.

Изменить : нарезал его еще немного.

Вы можете найти это полезным, от Администрации Debian: введение в завершение bash .


Полный скрипт: /some/location/my_ssh_autocomplete_script (означает только короткий стартер):

 #!/bin/bash _get_rsync_file_list() { # For test: #local -a flist=("foo" "bar") #printf "%s " "${flist[@]}" # Or: ls /tmp # For live something in direction of: #ssh user@host 'ls /path/to/dir' <-- but not ls for other then dirty testing. } _GetOptSSH() { local cur COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" case "$cur" in -*) COMPREPLY=( $( compgen -W '-h --help' -- "$cur" ) );; *) # This could be done nicer I guess: COMPREPLY=( $( compgen -W "$(_get_rsync_file_list)" -- "$cur" ) );; esac return 0 } 

Загрузите скрипт /some/location/my_ssh_download_script :

 #!/bin/bash server="myserver" path="/home/pierre/downloads" download_from_myserver() { for file; do rsync "$server:$path/$file" done } case "$1" in "-h"|"--help") echo "Download files from '$server', path: '$path'" >&2 exit 0;; esac download_from_myserver "$@" 

В .bash_aliases :

 alias download_from_myserver='/some/location/my_ssh_download_script' 

В .bash_completion :

 # Source complete script: if . "/some/location/my_ssh_autocomplete_script" >/dev/null 2>&1; then # Add complete function to download alias: complete -F _GetOptSSH download_from_myserver fi 
  • COMP_CWORD
  • COMP_WORDS
  • COMPREPLY