将 PHP 输出通过管道传输到 Linux“less”命令会导致“less”真正发挥作用。(CentOS 6.2,CentOS 5 没有发生这种情况。)
当我将 php 的输出通过管道传输到“less”时,它要求enter在每个命令之后按下该键,即使在“j”命令(向下滚动一行的命令)之后也是如此。此外,命令键显示在屏幕上,而“less”不会清理屏幕。
因此,运行后:
$ php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less
然后输入j(通常会向下滚动一行),我看到屏幕底部的“:”字符后面出现了一个“j”字符。按下后,enterless 最终“执行”了 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
我正在使用 Mac OS X 上的 Terminal.app 通过 ssh 连接到该框,然后运行 php 命令。
答案1
编辑:
找到了解决方案:< /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 也有这个问题(在虚拟机中)。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
答案2
这是一种奇怪的行为,很难重现......你有没有尝试将 TERM 设置为普通的 xterm
export TERM=xterm
或 vt100?
export TERM=vt100
尝试手动设置窗口大小(要滚动的行数,通常==窗口/控制台的行数):
...| less --window=80
或者尝试
... |less --raw-control-chars
或者
... |less --RAW-CONTROL-CHARS
PS 哦,顺便说一下,CentOS 6.2 于 2012 年 6 月发布,你有没有想过升级到新版本?当前的 CentOS 版本是 6.5...