Bash/php - любой способ реализовать ключ автозаполнения ключа для аргументов?

У меня есть командная строка PHP script, которая запускает задание на сервер задания, причем задание является аргументом. Имена заданий именуются такими именами, как Foo: Bar_Baz_JobName. Есть ли способ реализовать автоматическое завершение, например, как ввести первые несколько букв имени файла и нажать вкладку bash, чтобы завершить имя файла для вас. Я знаю, что это можно сделать, потому что выполнение табуляции работает на ubuntu с apt-get, я просто не знаю, можно ли это сделать в PHP.

Ответ 1

Автозаполнение выполняется с использованием библиотеки readline GNU, которая, по-видимому, доступна из PHP. В частности, посмотрите readline_completion_function. Использование довольно просто; вы вызываете readline_completion_function с одним аргументом, функцию обратного вызова, которая обрабатывает завершение. Функция обратного вызова принимает первые несколько букв (в основном, независимо от того, что вы вводите до нажатия TAB) в качестве входных данных и должна возвращать массив возможных совпадений.

Ответ 2

Да! вы можете сделать это с помощью PHP!

Команда CLIFramework предоставляет команду для генерации bash завершения script по вашим определениям команд.

Вы также можете определить свое завершение аргумента в PHP, сгенерированное завершение bash/zsh вернет результат выполнения из PHP во время выполнения:

https://github.com/c9s/CLIFramework

Screencast (bash):

enter image description here

Screencast (zsh):

enter image description here

Ответ 3

Вы можете попробовать readline, точнее, функцию readline_completion_function.

Ответ 4

О readline_completion_function

Я бы сказал, что учитывая тип взаимодействия, которое вы ищете (apt-get autocomplete) этот метод не является хорошим.

Фактически перед тем, как получить функцию автозаполнения, вам нужно запустить script, а затем вы получите доступ к функции автозаполнения.

Функция автозаполнения является частичной. Таким образом, это как автозаполнение bash не zsh.

В оболочке:

➜  ~ php test.php (enter) 
Custom command: (tab)
a b c
Custom command: (tab)
a b c

Код:

<?php
// test.php
class AutoController
{

    private static function getCommandsArray()
    {
        $my_dir = array('a', 'b', 'c');
        return $my_dir;
    }

    /**
     * The callback which is returning an array with strings, which will be
     * auto-completed.
     *
     * @param $input
     * @param $index
     * @return array
     */
    private static function completionCallback($input, $index)
    {
        return self::getCommandsArray();
    }

    /**
     * The method which is handling the autocompletion. After it runned, you can
     * autocomplete your commands by hitting the tab-button.
     */
    public function actionCompl()
    {
        readline_completion_function(array('self', 'completionCallback'));

        $command_input = readline("Custom command: ");

        passthru('echo ' . $command_input);
    }
}

$a = new AutoController();
$a->actionCompl();

О автозаполнении времени выполнения

Как было предложено c9s, можно получить такую ​​функциональность, но extending функциональность автозаполнения вашего bash, а не PHP.

Итак, если вы видите функцию автозаполнения CLIFramework, например, вы увидите:

BashGenerator.php
ZshGenerator.php

Используется для генерации bash script для расширения автозаполнения bash или zsh.

Итак, это зависит от оболочки, которую вы используете, так как вы должны сделать автозаполнение.

Некоторые ссылки: