我有一个PHP命令行脚本,它将作业启动到作业服务器,作业名称是一个参数.作业名称是命名空间,例如Foo:Bar_Baz_JobName.有没有办法实现自动完成,比如如何键入文件名的前几个字母,然后按tab bash为你完成文件名.我知道它可以完成,因为tab-completion在ubuntu上使用apt-get工作,我只是不知道它是否可以在PHP中完成.
Dav*_*d Z 12
自动完成是使用GNU readline库完成的,显然可以从PHP 访问.具体来说,看看readline_completion_function.用法很简单; 你readline_completion_function用一个参数调用,一个回调函数来处理完成.回调函数将前几个字母(基本上是按TAB之前键入的任何内容)作为输入,并应返回可能匹配的数组.
是! 你可以用PHP做到这一点!
CLIFramework提供了一个命令,可帮助您通过命令定义生成bash完成脚本.
您还可以在PHP中定义参数完成,生成的bash/zsh完成将在运行时从PHP返回执行结果:
https://github.com/c9s/CLIFramework
截屏(bash):

截屏视频(zsh):

我会说,考虑到您正在寻找的交互类型(apt-get autocomplete),这种方法并不好。
事实上,在获得自动完成功能之前,您必须运行脚本,然后才能访问自动完成功能。
自动完成功能是部分的。所以,它喜欢 bash 自动完成而不是 zsh。
在外壳中:
? ~ php test.php (enter)
Custom command: (tab)
a b c
Custom command: (tab)
a b c
Run Code Online (Sandbox Code Playgroud)
代码是:
<?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's 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();
Run Code Online (Sandbox Code Playgroud)
正如c9s所建议的那样,可以获得这种功能,但extending可以使用 bash 的自动完成功能,而不是 PHP。
因此,例如,如果您看到CLIFramework的自动完成功能,您将看到:
BashGenerator.php
ZshGenerator.php
Run Code Online (Sandbox Code Playgroud)
用于生成 bash 脚本以扩展 bash 或 zsh 自动完成功能。
因此,这取决于您使用的 shell 必须进行自动完成的方式。
一些参考: