A saída do PHP canalizada para 'less' está a requerer a entrada após cada comando

5

Pipar a saída do PHP para o comando 'less' do linux faz com que 'menos' realmente atue. (CentOS 6.2, não aconteceu com o CentOS 5).

Quando cano a saída de php para 'less', é necessário que a tecla enter seja pressionada após cada comando, mesmo após o comando 'j' (o comando para rolar uma linha). Além disso, a tecla de comando é exibida na tela e "less" não está limpando a tela.

Então, após a execução:

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

e depois digitando j (que normalmente rola uma linha abaixo), vejo um caractere 'j' aparecendo na parte inferior da tela após o caractere ':'. Pressionar enter faz com que menos finalmente "pegue" o comando j, e ele realmente rola, mas agora eu vejo o ": j" entre duas linhas adjacentes da saída:

10
:j
11

Ao usar menos com a saída equivalente do python, tudo está bem e menos funciona normalmente:

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

O que está acontecendo e como posso corrigi-lo?

Mais informações:

$ 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

Estou usando o Terminal.app no Mac OS X para ssh na caixa e, em seguida, executando o comando php.

    
por Eddified 22.11.2013 / 20:49

2 respostas

7

Editar:

Encontrou a solução: Você precisa fazer um < /dev/null após o comando PHP:

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

Aparentemente, o PHP se comporta de maneira diferente porque ainda espera a entrada de stdin .
Com o < /dev/null você força o PHP a pensar que não há mais entrada.

Editar 2 :

Se você não quiser (manter) digitando o < /dev/null , você pode criar um alias para php2 ou algo assim:

alias php2="php < /dev/null'

Você pode torná-lo permanente se adicioná-lo ao seu ~/.bashrc .

Agora você pode fazer:

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

Você pode alias php para si mesmo, mas nunca terá a capacidade de canalizar algo para php .
Você poderia, naturalmente, encurtá-lo para p (para menos digitação).

Resposta original:

O bug também está presente no CentOS 6.5.

Um novo CentOS 6.5 instalado também (em uma VM). Um ... | cat | less não funciona.
Um ... > a && cat a | less funciona. Vá a figura.

As teclas do cursor também não funcionam em php --help | less . Eles funcionam em python --help | less . Portanto, deve ser algo no executável do PHP . Eu acho que este é um bug de longa data no PHP.

Encontrei uma referência a esse bug aqui .

Até que seja corrigido, você precisa redirecionar:

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

Este é um comportamento estranho, difícil de reproduzir ... Você já tentou definir TERM para xterm simples

export TERM=xterm

ou vt100?

export TERM=vt100

Tente definir manualmente o tamanho da janela (número de linhas para rolar, geralmente == número de linhas da sua janela / console):

...| less --window=80

ou tente

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

ou

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

PS Ah, a propósito, o CentOS 6.2 foi lançado em junho de 2012, você pensou em uma atualização para uma versão mais recente? A versão atual do CentOS é 6.5 ...

    
por 02.12.2013 / 18:15