Для вывода PHP по каналу 'less' требуется <enter> после каждой команды

Передача вывода PHP в команду linux 'less' приводит к тому, что 'less' действительно работает. (CentOS 6.2, не было с CentOS 5.)

Когда я перенаправляю вывод из php в 'less', требуется нажимать клавишу ввода после каждой команды, даже после команды 'j' (команда для прокрутки вниз на одну строку). Кроме того, на экране появляется командная клавиша, и "меньше" не очищает экран.

Итак, после запуска:

$ php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less

и затем, набрав j (который обычно прокручивается вниз на одну строку), я вижу символ "j", появляющийся в нижней части экрана после символа ":". Нажатие клавиши ввода заставляет less окончательно "принять" команду j, и она действительно прокручивается, но теперь я вижу ":j" между двумя смежными строками вывода:

10
:j
11

При использовании less с эквивалентным выводом из python все нормально и less работает нормально:

$ python -c 'for i in xrange(1, 300): print i' | less

Что происходит и как мне это исправить?

Больше информации:

$ less --version
less 436
Copyright (C) 1984-2009 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

$ php --version
PHP 5.3.27 (cli) (built: Aug 26 2013 11:46:37)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

Я использую Terminal.app в Mac OS X, чтобы подключиться к ssh, а затем запускаю команду php.

2 ответа

Решение

Редактировать:

Нашел решение: нужно сделать < /dev/null после команды PHP:

php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' < /dev/null | less

Очевидно, PHP ведет себя по-другому, потому что он все еще ожидает ввода от stdin,
С < /dev/null Вы заставляете PHP думать, что больше нет ввода.

Изменить 2:

Если вы не хотите (продолжать) печатать < /dev/null Вы можете создать псевдоним для php2 или что-то:

alias php2="php < /dev/null`

Вы можете сделать это постоянным, если вы добавите его в свой ~/.bashrc,

Теперь вы можете сделать:

php2 -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less

Вы могли бы псевдоним php сам по себе, но тогда у вас никогда не будет возможности направить что-то в php,
Вы можете, конечно, сократить его до p (для меньшего набора текста).


Оригинальный ответ:

Эта ошибка также присутствует в CentOS 6.5.

У недавно установленного CentOS 6.5 это тоже есть (в ВМ). ... | cat | less не работает.
... > a && cat a | less работает. Пойди разберись.

Клавиши курсора также не работают в php --help | less, Они работают в python --help | less, Так что это должно быть что-то в исполняемом файле PHP. Я думаю, что это давняя ошибка в PHP.

Я нашел ссылку на эту ошибку здесь.

Пока это не исправлено, вам нужно сделать редирект:

php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' > /tmp/php.txt && cat /tmp/php.txt | less

Это странное поведение, которое трудно воспроизвести... Вы пытались установить TERM на простой xterm

export TERM=xterm

или вт100?

export TERM=vt100

Попробуйте вручную установить размер окна (количество строк для прокрутки, обычно == количество строк вашего окна / консоли):

...| less --window=80

или попробуйте

... |less --raw-control-chars

или же

... |less --RAW-CONTROL-CHARS

PS Кстати, CentOS 6.2 был выпущен в июне 2012 года. Вы думали об обновлении до более новой версии? Текущая версия CentOS 6.5 ...

Другие вопросы по тегам