Написание скрипта завершения bash, похожего на scp

У меня есть сценарий, который, как я думал, разрешит завершение через завершение Bash.

Сценарий принимает строковый аргумент в кавычках, а затем файл или сервер, например.

my_cmd "something"  stuff

Я думал, что смогу использовать то же завершение, что и команда scp:

have my_cmd &&
_my_cmd()
{
    . /usr/share/bash-completion/completions/scp >/dev/null 2>&1 && complete -F _scp $1 && return 124
} && complete -F _my_cmd my_cmd

Что работает, однако это добавляет двоеточие к известным серверам. Не очень хорошо зная, как работает bash-complete, есть ли у вас лучшие идеи для этого?


person Alasdair    schedule 08.08.2014    source источник
comment
что было до my_cmd && ?   -  person AKS    schedule 09.08.2014
comment
нужно убедиться, что команда my_cmd существует, см. здесь: stackoverflow .com/questions/12874920/   -  person Alasdair    schedule 12.08.2014


Ответы (1)


Если вы посмотрите на завершение scp, оно использует _known_hosts_real из /usr/share/bash-completion/bash-completion:

# Helper function for completing _known_hosts.
# This function performs host completion based on ssh's config and known_hosts
# files, as well as hostnames reported by avahi-browse if
# COMP_KNOWN_HOSTS_WITH_AVAHI is set to a non-empty value.  Also hosts from
# HOSTFILE (compgen -A hostname) are added, unless
# COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an empty value.
# Usage: _known_hosts_real [OPTIONS] CWORD
# Options:  -a             Use aliases
#           -c             Use `:' suffix
#           -F configfile  Use `configfile' for configuration settings
#           -p PREFIX      Use PREFIX
# Return: Completions, starting with CWORD, are added to COMPREPLY[]

Итак, что вы, вероятно, хотите:

_my_cmd() {
    local cur prev words cword
    _init_completion || return
   _known_hosts_real -a "$cur"
} && complete -F _my_cmd my_cmd

Это работает для меня, по крайней мере. Признаюсь, обычно я их не пишу, но это похоже на то, как работают другие дополнения. Вот еще один связанный пример, если вы хотите сделать еще несколько shell foo с вашими дополнениями:

https://unix.stackexchange.com/questions/136351/autocomplete-server-names-for-ssh-and-scp

Отредактировано:

Вот хосты и файлы, в основном вдохновленные тем, что делает _scp_local_files:

_my_cmd() {
    local cur prev words cword
    _init_completion || return

   _known_hosts_real -a "$cur"

    COMPREPLY+=( $( ls -aF1dL $cur* 2>/dev/null | \
        sed -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' -e "s/^/$prefix/") )

} && complete -F _my_cmd my_cmd

Опять же, это просто брать то, что вы хотите, из _scp завершения и делать свое собственное. Это работает для меня, но завершение имени каталога немного шаткое.

person zerodiff    schedule 13.08.2014
comment
Да, это нормально работает для серверов без суффикса, причина, по которой я пытался использовать завершение scp, заключалась в том, что оно также завершало имена файлов. Вы знаете, как бы я объединил несколько правил? Ваше здоровье. - person Alasdair; 19.08.2014
comment
Я понимаю, что вы имеете в виду под завершением каталога — в конце добавляется пробел. Посмотрим, смогу ли я понять, почему это так. - person Alasdair; 20.08.2014