2016-04-19 2 views
0

Я на Ubuntu 14.04, с PHP 5.5.9. Там, у меня есть очень простой файл a.php:Почему «exec» не выполняет команду до тех пор, пока я не распечатаю ее вывод?

<?php 

$a = exec('clear'); 
print($a); 

Если я запустить сценарий как теперь я получаю:

$ php a.php 
<screen cleared> # nothing is displayed in the screen 
       # "clear" was performed successfully 

Однако, если я закомментировать print($a) просто есть файл, как это:

<?php 

$a = exec('clear'); 

ничего не происходит:

$ php a.php 
$    # nothing happened, I see the previous line above 

Насколько я понимаю, это вызов переменной $a, что делает clear. Но это не имеет особого смысла, так как exec() docs говорит:

Exec - Выполнить внешнюю программу

Есть ли причина, почему clear не получает выполняется до тех пор, print() называется?

Обратите внимание, что это связано с вопросом Clear CMD-shell with php, но я спрашиваю здесь , почему это происходит.

+1

Ум, чтобы объяснить причину понижения? Я буду рад дать больше информации тем, кого интересует этот вопрос. – fedorqui

+0

Я переформулировал вопрос, чтобы выразить то, что я точно хотел сказать: * Почему не происходит очистка? * – fedorqui

ответ

2

На самом деле, очистка выполняется при вызове exec. Вы просто не видите его действие на экране, пока вы его не выведете.

+0

Но действие 'clear' - очистить экран, почему я должен ждать, пока его действие« произойдет »до тех пор, пока происходит «печать»? – fedorqui

+1

clear просто выводит пару управляющих последовательностей. В вашем случае выход переходит в $ a. Терминал не очищается, пока вы его не отправите, распечатав его. –

+0

@fedorqui, в консоли do 'clear | od -t x1'. Как говорит Адриан, в системах * NIX консоль управляется управляющими кодами. (См. Например 'man console_codes' в Linux). Компьютер, на котором выполняется 'clear', не нужен, где консоль. И это не настоящая консоль. Коды консоли формируют протокол, который позволяет приложению контролировать консоль независимо от того, где она находится или как она реализована. – Dummy00001

Смежные вопросы