将 PHP 输出传送到 linux 'less' 命令会导致 'less' 真正起作用。(CentOS 6.2,CentOS 5 没有。)
当我将 php 的输出通过管道传输到 'less' 时,它需要enter在每个命令之后按下该键,即使在 'j' 命令(向下滚动一行的命令)之后也是如此。此外,命令键显示在屏幕上,而“少”不会清理屏幕。
所以,运行后:
$ php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less
Run Code Online (Sandbox Code Playgroud)
然后输入j(通常向下滚动一行),我看到一个 'j' 字符出现在屏幕底部的 ':' 字符之后。按下enter导致 less 最终“接受”j 命令,它确实滚动,但现在我看到输出的两个相邻行之间的“:j”:
10
:j
11
Run Code Online (Sandbox Code Playgroud)
将 less 与 python 的等效输出一起使用时,一切都很好,并且不太正常:
$ python -c 'for i in xrange(1, 300): print i' | less
Run Code Online (Sandbox Code Playgroud)
这是怎么回事,我该如何解决?
更多信息:
$ 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
Run Code Online (Sandbox Code Playgroud)
我在 Mac OS X 上使用 Terminal.app ssh 到盒子,然后运行 php 命令。
编辑:
找到解决方案:你需要< /dev/null
在PHP命令之后做一个:
php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' < /dev/null | less
Run Code Online (Sandbox Code Playgroud)
显然 PHP 的行为有所不同,因为它仍然期望来自stdin
.
随着< /dev/null
你强迫 PHP 思考,没有进一步的输入。
编辑2:
如果您不想(继续)输入,< /dev/null
您可以为以下内容创建别名php2
:
alias php2="php < /dev/null`
Run Code Online (Sandbox Code Playgroud)
如果您将其添加到您的~/.bashrc
.
现在你可以这样做:
php2 -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less
Run Code Online (Sandbox Code Playgroud)
你可以php
给它自己取别名,但是你永远无法将某些东西通过管道传输到php
.
您当然可以将其缩短为p
(以减少打字次数)。
原答案:
该错误也存在于 CentOS 6.5 中。
新安装的 CentOS 6.5 也有(在虚拟机中)。A... | cat | less
不起作用。
A... > 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
Run Code Online (Sandbox Code Playgroud)