为什么 SPACE 有时不适用于更多(或更少)

为什么 SPACE 有时不适用于更多(或更少)

通常,|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

和寻呼机运行moreless其标准输入连接到命令管道中先前元素的输出。他们必须显式打开控制 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:lessqstty

如果被分页的命令在启动时立即对 TTY 执行某些操作,则存在竞争条件:哪一个将首先干扰 TTY:程序less(为了设置一次字符输入)或程序被寻呼?这就是为什么sleep上面的测试中有一个;让我们less赢得比赛。

听起来确实好像php(无论是它本身还是由 加载和执行的东西php)可能已经用 TTY 做了一些有趣的事情,并且这个问题已经被修复了。

相关内容