Readline list history: примеры (PHP)
readline_list_history: arrayФункция readline_list_history в PHP предназначена для получения полной истории команд, введенных в интерактивной оболочке readline. Она применяется в CLI-скриптах, которые используют библиотеку readline для интерактивного ввода.
Функция не принимает аргументов и возвращает массив, содержащий все записи истории. Каждый элемент массива соответствует одной команде в истории. Если история пуста или функция недоступна, возвращается пустой массив.
Функция доступна только при активном расширении readline. Ее использование без поддержки readline приводит к предупреждению и возврату пустого массива. История команд сохраняется в течение сессии и может быть заполнена через readline_add_history или интерактивный ввод.
Простой пример вызова функции:
<?
// Добавляем несколько команд в историю
readline_add_history('command1');
readline_add_history('command2');
// Получаем историю
$history = readline_list_history();
print_r($history);
?>Array
(
[0] => command1
[1] => command2
)<?
// Очищаем историю (пример)
// readline_clear_history();
$history = readline_list_history();
var_dump($history);
?>array(0) {
}Функция readline_info возвращает или устанавливает различные параметры readline, включая данные о истории. Может предоставить больше контекстной информации.
Функции для чтения и записи истории в файл. Полезны для сохранения истории между сессиями, тогда как readline_list_history работает только с текущей сессией.
Очищает текущую историю. Используется для управления содержимым, которое затем можно получить через readline_list_history.
В Python модуль readline предоставляет функцию get_history_item для получения конкретного элемента истории. Для получения всей истории используется readline.get_current_history_length и цикл.
import readline
for i in range(1, readline.get_current_history_length() + 1):
print(readline.get_history_item(i))command1 command2
В Node.js история управляется через объект Interface. Прямого аналога нет, но история хранится во внутреннем массиве.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
historySize: 50
});
// История доступна через rl.historyВ bash история команд доступна через встроенную команду history, которая выводит список с номерами.
Вызов функции без поддержки readline вызывает предупреждение.
<?
// Если расширение readline не загружено
$history = readline_list_history();
var_dump($history);
?>PHP Warning: readline_list_history(): Unable to get history
array(0) {
}Функция предназначена для CLI-режима. В веб-среде она не имеет практического смысла и может не работать.
Функция возвращает новый массив при каждом вызове. Изменение этого массива не влияет на исходную историю.
Функция readline_list_history была добавлена в PHP 4.3.0. С тех пор ее поведение остается стабильным.
В PHP 8.0 существенных изменений в работе функции не произошло. Расширение readline продолжает поддерживаться без депрекации.
Важно отметить, что в некоторых сборках PHP расширение readline может отсутствовать, что приводит к недоступности функции.
<?
// Добавляем тестовые данные
readline_add_history('git commit -m "Initial"');
readline_add_history('php -v');
readline_add_history('git status');
readline_add_history('ls -la');
// Получаем историю и фильтруем команды git
$history = readline_list_history();
$gitCommands = array_filter($history, function($cmd) {
return strpos($cmd, 'git') === 0;
});
print_r($gitCommands);
?>Array
(
[0] => git commit -m "Initial"
[2] => git status
)<?
// Загружаем историю из файла, если существует
$historyFile = 'history.txt';
if (file_exists($historyFile)) {
readline_read_history($historyFile);
}
// Интерактивный ввод
$line = readline('Введите команду: ');
readline_add_history($line);
// Получаем и отображаем историю
$history = readline_list_history();
echo "Текущая история:\n";
foreach ($history as $index => $command) {
echo sprintf("%d: %s\n", $index + 1, $command);
}
// Сохраняем историю
readline_write_history($historyFile);
?><?
// Имитация истории
$commands = ['ls', 'cd', 'ls', 'php', 'ls', 'git'];
foreach ($commands as $cmd) {
readline_add_history($cmd);
}
// Подсчет частоты
$history = readline_list_history();
$frequency = array_count_values($history);
arsort($frequency);
print_r($frequency);
?>Array
(
[ls] => 3
[cd] => 1
[php] => 1
[git] => 1
)<?
readline_completion_function(function($input, $index) {
$history = readline_list_history();
$matches = [];
foreach ($history as $command) {
if (strpos($command, $input) === 0) {
$matches[] = $command;
}
}
return $matches;
});
// Демонстрация: ввод 'gi' предложит 'git' из истории
?>