PHP output piped to 'less' is requiring <enter> after every command </enter>

1056
Eddified

Piping PHP output to the linux 'less' command causes 'less' to really act up. (CentOS 6.2, didn't happen with CentOS 5.)

When I pipe output from php into 'less', it requires the enter key be pressed after every command, even after the 'j' command (the command to scroll down one line). In addition, the command key is showing up on-screen, and 'less' isn't cleaning up the screen.

So, after running:

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

and then typing j (which usually scrolls down one line), I see a 'j' character showing up at the bottom of the screen after the ':' character. Pressing enter causes less to finally "take" the j command, and it does indeed scroll, but now I see the ":j" between two adjacent lines of the output:

10 :j 11 

When using less with the equivalent output from python, everything is fine and less acts normally:

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

What's going on and how do I fix it?

More info:

$ 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 

I'm using Terminal.app on Mac OS X to ssh to the box, then running the php command.

5
Это, вероятно, настройка терминала (что говорит echo $ TERM). Я попробовал тот же скрипт в моем CentOS 6.2, и он работал как положено. Интересно, может ли это быть связано с тем, как ваш терминал интерпретирует CR и LF. Что произойдет, если вы используете "\ r \ n", а не просто "\ n"? davidgo 10 лет назад 1
$ TERM - это «экран». :) Если я попробую это без экрана, он говорит «xterm-256color» и все еще не работает правильно. Eddified 10 лет назад 0
Ни Ubuntu 13.04, ни Debian Testing не делают этого. Я бы обвинял их в меньшей реализации. Braiam 10 лет назад 0
В какой версии CentOS 5 это работало? Я на 5.9, и он показывает те же проблемы, которые вы выделяете для 6.2. slm 10 лет назад 0
Он корректно работает на моей установке CentOS 5.5. Eddified 10 лет назад 0
Пожалуйста, не могли бы вы добавить следующие детали: `less --version` и` php --version`? PS Может быть, PHP распознает только `php -v` для запроса номера версии. t0r0X 10 лет назад 0
Еще вопросы: вы пытаетесь сделать это в окне терминала в графической среде, непосредственно в неграфической консоли или через программу терминала / ssh / telnet? t0r0X 10 лет назад 0

2 ответа на вопрос

7
Rik

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

Нашел решение: Вам нужно сделать < /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 
Я уже понял, что `...> tmpfile && cat tmpfile | Менее обходной путь сам по себе ... это очень раздражающий обходной путь, но он работает. `</ Dev / null` обходной путь лучше, но все еще только обходной путь, но я дал вам награду за усилия. :) Eddified 10 лет назад 0
Лично я считаю, что, хотя в PHP здесь может быть ошибка, ошибка меньше * тоже *. Обычно (то есть с CentOS 5), когда у меня есть долго работающая программа, обычно можно использовать меньше, тогда как php продолжает выводить данные. Eddified 10 лет назад 0
Я добавил Edit # 2. Вы можете использовать `alias` (например,` php2`), чтобы "облегчить боль" :) У вас была та же версия PHP (5.3.3?) В CentOS 5, что и в CentOS 6.2? Rik 10 лет назад 0
Нет, раньше у меня была другая версия php (5.1). Eddified 10 лет назад 0
Я думаю, нам нужен кто-то с установленной RPM PHP 5.3.28+ на CentOS 5, чтобы проверить это. Или установить PHP 5.1.x на CentOS 6.2+. Rik 10 лет назад 0
Это ** определенно ** проблема PHP. Я сделал снимок моего CentOS 6.5, удалил PHP 5.3.3, установил RPM PHP 5.2.17 (и его зависимости), и проблема была ** решена **. После повторной установки стандартного пакета из CentOS 6.5 (PHP 5.3.3) проблема снова возникла. Таким образом, эта проблема возникает между версиями PHP PHP 5.2.17 и 5.3.27. Rik 10 лет назад 0
2
t0r0X

Это странное поведение, которое трудно воспроизвести ... Вы пытались установить 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 ...

Ни одно из этих предложений не сработало. У меня нет контроля над версией CentOS. Eddified 10 лет назад 0
Это ведет себя лучше, когда вы передаете его через другую программу? Например `... | кот | less` t0r0X 10 лет назад 0
`... | кот | Менее не помогает. Eddified 10 лет назад 0