Программный доступ к bash для определенных команд - PullRequest
22 голосов
/ 19 августа 2010

Я пытаюсь написать небольшое приложение для запуска команд, и мне хотелось бы использовать дополнения в bash в моей собственной системе завершения.Я смог получить список завершений для общих команд, используя compgen -abck.
Однако я также хотел бы получить завершения для конкретных команд: например, вход git p должен отображать завершение для команд git.

Можно ли как-нибудь использовать compgen для этого?Если нет, есть ли другие способы, которыми я могу получить список завершений программно?

[РЕДАКТИРОВАТЬ: Чтобы уточнить, я не пытаюсь предоставить завершение bash - мойприложение является средством запуска команд с графическим интерфейсом.Я просто хотел бы использовать существующие дополнения bash в своем собственном приложении.]

Ответы [ 5 ]

12 голосов
/ 04 сентября 2010

Я не знаю, как это работает, но потрясающий оконный менеджер использует следующий код Lua для получения доступа к результату завершения bash:

https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119

  1. Через complete -p находим complete -o bashdefault -o default -o nospace -F _git git.Мы помним «_git» на потом.
  2. Длина «git l» равна 5, поэтому мы устанавливаем COMP_COUNT = 6.Мы заканчиваем первый аргумент для «git», поэтому COMP_CWORD = 1.

Все вместе мы используем следующий скрипт:

__print_completions() {
    printf '%s\n' "${COMPREPLY[@]}"
}

# load bash-completion functions
source /etc/bash_completion

# load git's completion function
_completion_loader git

COMP_WORDS=(git l)
COMP_LINE='git l'
COMP_POINT=6
COMP_CWORD=1
_git
__print_completions

Вывод: «log»

4 голосов
/ 29 августа 2010

Посмотрите на администрирование Debian Введение в завершение bash - это довольно легко понять - кстати, у него также есть часть вторая .

2 голосов
/ 22 августа 2010

Проверьте в каталоге /etc/bash_completion.d/.Здесь находятся различные сценарии завершения команд.

0 голосов
/ 03 сентября 2010

Некоторое время назад я взломал этот скрипт, который дает вам довольно точное Завершение Bash-страницы для человека Я знаю, что другие люди делали подобные вещи с парсингом --help опции вывода.

0 голосов
/ 30 августа 2010

Вот простой, но работающий пример в bash:

function foo_completion()
{
    local currentWord=${COMP_WORDS[COMP_CWORD]}
    local completionList=""

    case "${COMP_CWORD}" in
        "1")
            completionList="command1 command2 command3";
            ;;
        "2")
            completionList="param1 param2 param3";
            ;;
    esac

    COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) )
}

complete -F foo_completion foo

С этим видом кода вы получите команду N завершенной, когда вы наберете "foo c" + tab, и paramN, завершенной, когда вы наберете "foo command1p "+ tab

Вы можете вычислить список завершения из справки команды.

my2c

...