2

Чтобы получить легкое заполнение bash для ключей командной строки для скриптов, я изучал функцию _parse_help в/etc/bash_completion (debian sid, bash v4.2-1, bash-completion v1: 1.99-3).bash завершение _parse_help сломан?

Мой сценарий генерирует сообщение справки в том, что я считаю стандартный формат GNU:

MYSCRIPT [OPTIONS] 

Usage: 
    -h, --help  Show this help message 
    -o, --option Some option 

Я затем активировать завершение через complete -F _parse_help ./myscript.

К сожалению, это не дает желаемого результата. На первой вкладке ./myscript <TAB> (обратите внимание, что всего лишь одно нажатие) появляется неформатированный список, содержащий -help и -option, а не сокращенные версии. Хуже того, завершение любого из вариантов не выполняется. Фактически, просто ввод тире приводит к тому, что _parse_help полностью прекращает генерировать вывод.

Все это очень сильно сломано, и я не могу найти много ссылок на него в Интернете. Возможно, эта функция считается устаревшей? Есть ли еще один стандартный метод завершения командной строки на основе разбора --help output?

ответ

5

Согласно bash reference manual-F function ожидает, чтобы прочитать список слов из переменной COMPREPLY

Казалось бы, что _parse_help не устанавливает эту требуемую переменную и будет не следоватьльно подходить в качестве функции complete -F. Вывод, очевидно, echo'd, как видно из выполнения функции.

$ _parse_help ./myscript 
-h 
--help 
-o 
--option 

@gertjan Что вы пытаетесь можно выполнить с помощью опции -W wordlist вместо этого.

$ complete -W "$(_parse_help ./myscript)" ./myscript 
$ ./myscript - 
--help --option -h  -o 
$ ./myscript -- 
--help --option 
$ ./myscript --help 

Завершение работы, как и ожидалось, и --h завершит --help или там, где было несколько аргументов, как с «-» она будет перечислять только соответствующие параметры.

Если мы пытались использовать функцию, но недостаточно только установить COMPREPLY, как вы увидите из следующего примера.

Примечание:COMPREPLY является массивом Баша и требует скобок () при установке

$ function _myscript() { 
>  COMPREPLY=($(_parse_help ./myscript)) 
> } 
$ complete -F _myscript ./myscript 
$ ./myscript - 
--help --option -h  -o 
$ ./myscript -- 
--help --option -h  -o 
$ ./myscript --help 
--help --option -h  -o 

Как вы можете видеть, несмотря на то, отображаются параметры, complete теперь ожидают нас, чтобы сделать фильтрацию. Мы можем выполнить это с помощью compgen, но сначала нам нужно определить, к какому аргументу текущего фильтра следует отфильтровать. Функция _get_comp_words_by_ref может помочь в этом, заполнив переменную $cur, согласно нашему заключительному примеру.

Полная реализация с использованием функции с _parse_help для завершения bash.

$ function _myscript() { 
>  _get_comp_words_by_ref cur 
>  COMPREPLY=($(compgen -W "$(_parse_help ./myscript)" -- "$cur")) 
> } 
$ complete -F _myscript ./myscript 
$ ./myscript - 
--help --option -h  -o 
$ ./myscript -- 
--help --option 
$ ./myscript --help 

nJoy!

+0

Ах да, это работает. Отлично. Большое спасибо, я действительно не мог понять, что это! – gertjan

+0

Рад помочь! знак равно –

Смежные вопросы