SlavaAurim
@SlavaAurim
Веб-программист и интернет-маркетолог

Как не закрывать консоль (и не выводить лишнего) при вызове консольного PHP-CLI сркипта?

Я хочу сделать консольный php-скрипт, чтобы при двойном клике по файлу отрывалась консоль (программа Терминал в Mac OS X), скрипт выводил результат работы, и консоль не закрывалась. Но при этом чтобы не выводилось ничего лишнего и отвлекающего.

Например, я создаю файл "Hello" или "Hello.command" с таким содержимым:
#! /usr/bin/env php
<?php
echo "\n\nПривет мир!\n\n";


Сохраняю файл, устанавливаю для него права 755. Делаю двойной клик, – вызывается консоль, и через мгновение закрывается. Проблема: нельзя увидеть результат выполнения программы.

Ладно, почитал в интернетах, советуют сделать настройку в Терминале, чтоб не закрывался после заверения скрипта. Идём в настройки: Терминал > Настройки > настройки > Shell > "При выходе из shell" ставим "Не закрывать окно". (система Mac OS X 10.8)

Пробую запустить скрипт. Консоль открывается, теперь не закрывается, и выводит:

Last login: Mon Aug  1 01:13:40 on ttys004
MyMac:~ user$ /Users/user/folder/bin/test ; exit;

Привет мир!

logout

[Процесс завершен]


Как избежать лишнего вывода? Можно ли оставить только "Привет мир!" а всё остальное вообще, чтобы не было?
  • Вопрос задан
  • 1314 просмотров
Решения вопроса 1
SlavaAurim
@SlavaAurim Автор вопроса
Веб-программист и интернет-маркетолог
Нашёл решение. Конечно, это хак, но выглядит почти так, как нужно:

#! /usr/bin/env php
<?php
system('clear');

echo "\n\nПривет мир!\n\n";

echo "\033[37m" , "Нажмите Esc для выхода..."; // светло-серая подсказка  
system("stty -icanon"); // отключение буферизации символов в терминале
while( ord( fread(STDIN, 1)) != 27 ) {} // считываем нажатые символы,  до нажатия Esc
exit;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Вообще, это не совсем правильный подход. Решать такую задачу нужно на уровне терминала. Просто то, что вы делаете по клику - это изначально такая процедура, при которой окно терминала будет открыто только пока процесс не завершился.
На уровне PHP можно, конечно, прибегнуть к хаку и, например, ждать ввода. Но это концептуально неверно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы