PHP readline异常:按多次Tab键输出scandir内容
PHP CLI中readline连续按Tab输出目录内容的问题
问题描述
在CLI环境使用PHP的readline函数处理用户输入时,连续按下多次Tab键,输入流中会输出当前目录的文件/目录列表(类似scandir的内容),相关代码如下:
$msg = ""; while ($msg != "quit") { while (($msg == "") || ($msg == "\r")) $msg = readline ("> "); }
原因分析
这是因为PHP的readline扩展默认启用了文件系统自动补全功能,当按下Tab键时,readline会自动尝试补全当前输入的路径;若输入为空时连续按Tab,就会列出当前目录下的所有文件和目录。
解决方法
方法1:禁用自动补全功能
通过readline_completion_function()设置一个空的补全函数,即可禁用默认的文件补全行为:
// 设置空补全函数,关闭默认补全逻辑 readline_completion_function(function() { return []; }); $msg = ""; while ($msg != "quit") { while (($msg == "") || ($msg == "\r")) $msg = readline ("> "); }
此时按下Tab键,readline不会再输出目录内容,只会插入Tab字符(或无反应,取决于终端配置)。
方法2:自定义补全规则
如果需要保留补全功能但不想显示目录内容,可以自定义补全逻辑,比如仅补全预设的命令:
// 自定义补全函数,仅对指定命令进行补全 readline_completion_function(function($input) { $commands = ['quit', 'help', 'start']; return array_filter($commands, function($cmd) use ($input) { return str_starts_with($cmd, $input); }); }); $msg = ""; while ($msg != "quit") { while (($msg == "") || ($msg == "\r")) $msg = readline ("> "); }
此时按Tab键只会补全预设的命令,不会再列出目录文件。
内容的提问来源于stack exchange,提问作者E Net Arch
相关产品推荐
相关产品推荐

