2015-03-24 3 views
1

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

Итак, я хочу написать функцию завершения, которая завершит имя команды и завершит аргументы для этой команды.

Так что я могу завершить имя команды, как этот

if [[ "$COMP_CWORD" == 1 ]]; then 
    COMPREPLY=($(compgen -c ${COMP_WORDS[COMP_CWORD]})) 
else 
    #Don't know what to write here 
fi 

Так что это завершит первый аргумент списка команд оболочки, которые доступны для запуска. И по второму и другим аргументам мне нужно выполнить команду ${COMP_WORDS[COMP_CWORD]}.

Я думал об удалении первого элемента из COMP_WORDS, уменьшаясь COMP_CWORD по одному и вызвать функцию _${COMP_WORDS[0]} с именем, что префиксы «_» в команду, потому что во многих примерах функции, которая завершает команду имеет такое название, но когда Я выполнил complete -p в bash. Я обнаружил, что многие команды завершены функциями, имеющими разные имена. И что касается меня, такое решение выглядит очень плохо.

Я не гуру сценариев, так что я просто не знаю, с чего начать поиск решения.

+2

Проверить завершение, как команда для 'sudo' works ... sudo принимает команду & arguments для этой команды в качестве параметров завершения ... То же, что и ваш скрипт. – anishsane

+1

Посмотрите, будет ли' complete -F _ команда name-of-your-script' works .. – anishsane

+0

@anishsane Спасибо. =) Я забыл, что завершение sudos делает то же самое поведение, в котором я нуждаюсь. Я смотрю на скрипт завершения и обнаружил, что «_command_offset 1» делает именно то, что мне нужно в другой части. Я проверю это на пару дней, если есть какое-то неожиданное поведение и опубликуйте решение здесь, если все будет в порядке. – JustAnotherCurious

ответ

1

Ваше требование аналогично завершению команды для exec или time или xargs. Эти команды также принимают команду &, что аргументы команды являются параметрами завершения.

Проверка опции bash_completion для exec:

$ complete | grep exec 
complete -F _command exec 

Вы можете повторно использовать ту же самую функцию _command в качестве функции завершения ..

Использование:

complete -F _command your-script.sh 
+0

Спасибо, это самый простой способ решить задачу. Вчера я просто не понял ваш комментарий к вопросу. И теперь я понимаю, что вы имеете в виду. – JustAnotherCurious

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