通常,|more
我按空格键即可获得另一屏。但对于某些命令,空格什么也不做,我实际上需要继续执行空格键来一次向前滚动一个屏幕。两者的more
行为less
相同。
在这台机器上,此命令显示两种行为:
php -i |more;tree -A |more
对于 PHP,我需要在每个空格后按 ENTER 键;我tree
只需按空格键,它就会滚动。
我尝试了一些技巧,例如2>&1
使用 bash,但没有运气,例如
bash -c "php -i 2>&1;tree -A" | more
像这样连接命令意味着整个输出需要按空格键。所以我想知道 PHP 是否输出了一些令人不安的控制字符more
?
我已经通过 SSH 尝试过另一台机器,但php -i
没有出现此行为。
(我已LESS
设置为-FRX
。但是我已清除该变量并且行为是相同的。)
这只是一个小刺激,所以我不会开始将两个系统分开寻找差异......只是想知道它是否给任何人敲响了警钟。
**更新(2014 年 11 月 26 日)**
有人联系我说他们可以通过以下方式重现此内容:
Ubuntu 10.04.4 LTS GNU bash,版本 4.1.5(1)-release(x86_64-pc-linux-gnu)PHP 5.3.2-1ubuntu4.21 带有 Suhosin-Patch(cli)(构建于:2013 年 9 月 4 日 19:13:13)
我当前的系统现在是 Mint 17 (PHP 5.5.9-1ubuntu4.5),我没有这种行为。在 Ubuntu 14.04.1(通过 SSH)上也很好。
我在 Ubuntu 11.10(通过 SSH)上确实遇到了问题。 PHP 5.3.6-13ubuntu3.10
在 Ubuntu 12.10 上(通过 SSH)没问题。 PHP 5.4.6-1ubuntu1.4
所以它看起来像是一个可能在 Ubuntu 11.x 和 12.x 之间或者 php 5.3 和 5.4 之间修复的错误? (如果没有人能提出更多证据,我将在几周后将其作为自我回答发布。)
答案1
和寻呼机运行more
时less
其标准输入连接到命令管道中先前元素的输出。他们必须显式打开控制 TTY 设备才能提供其寻呼 UI。控制 TTY 也是管道第一个元素的标准输入。
如果被分页的命令正在从 TTY 读取和/或干扰它(更改 TTY 设置),您会得到类似这样的奇怪行为。
对于疯狂的“旅行”,请尝试以下操作:
$ vi file | less
以下是我们如何对通常是热键的东西提出less
要求:Enter
(echo foo; sleep 1; stty icanon; bar) | less
如果您等待bar
出现,并随后less
出现提示,那么您将无法less
通过键入来退出q。您必须输入qEnter.该程序通过将 TTY 置于规范的输入处理模式来扰乱 TTY:一次一行输入,而不是一次一个字符。
如果您在执行过程中快速点击Ctrl- ,您将立即收到提示,并且可以退出,因为从未有机会执行。Csleep 1
:
less
qstty
如果被分页的命令在启动时立即对 TTY 执行某些操作,则存在竞争条件:哪一个将首先干扰 TTY:程序less
(为了设置一次字符输入)或程序被寻呼?这就是为什么sleep
上面的测试中有一个;让我们less
赢得比赛。
听起来确实好像php
(无论是它本身还是由 加载和执行的东西php
)可能已经用 TTY 做了一些有趣的事情,并且这个问题已经被修复了。