У меня есть сценарий PHP CLI и я хочу выполнить интерактивную команду bash (например, less huge-file.txt
) из этого сценария и получить тот же вид (с less
например навигационные элементы управления), как будто я запустил его прямо из терминала.
Нормальный system()
вызова недостаточно, потому что они не Пауза и просто вернуть все выходные сразу (в случае, например, less
).
Смысл в том, что у меня есть сценарий CLI, который организует несколько задач. Некоторые из них используют сложные команды bash, и я просто хочу вызвать сценарии bash из PHP, но получить исходное поведение терминала.
Да, это возможно. Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash. Получи это здесь: https://github.com/merlinthemagic/MTS
Я сомневаюсь, что вы действительно ищете сценарий, использующий меньше (это будет ужасно, head / tail / sed / awk — ваши друзья в манипулировании текстом), но получить реальное поведение оболочки вполне возможно.
После загрузки вы просто используете следующий код:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false);
//open file in less. $return1 will contain the view and the first part of the file you opened. The second argument is needed to delimit the return since less will not end in a shell prompt.
$return1 = $shell->exeCmd('less /path/to/huge-file.txt', 'huge-file.txt');
//quit less, you must do this or the shell will hang on the less prompt and will have to be forcefully terminated.
$return2 = $shell->exeCmd('q');
proc_open( 'less huge-file.txt', array( STDIN, STDOUT, STDERR), $pipes);
Это вызывает команду и пропускает все элементы управления и т. Д., Так что нет никакого различия от нормального less huge-file.txt
,
Все еще немного неуклюже, но намного короче по сравнению с другими примерами, которые я мог найти.