我知道可以使用\r
回到上一行并覆盖其内容。
现在如何进入前一行以更改内容?
或者是否有一种方法可以将内容打印到控制台窗口的特定光标位置?
我的目标是使用PHP创建一些自刷新的多行控制台应用程序。
我知道可以使用\r
回到上一行并覆盖其内容。
现在如何进入前一行以更改内容?
或者是否有一种方法可以将内容打印到控制台窗口的特定光标位置?
我的目标是使用PHP创建一些自刷新的多行控制台应用程序。
使用ANSI转义码移动光标。例如:Esc [ 1 F
。要将Escape字符放入字符串中,您需要以数值方式指定其值,例如"\x1B[1F"
如sujoy建议,您可以使用PHP ncurses以更抽象的方式移动光标。
虽然大多数“控制台”都支持ANSI转义码,但其他类型的终端使用不同的字符序列,ncurses
提供了一个标准化的API,它是终端独立的。如果您感兴趣,可以快速查看/etc/termcap
(然后查看man terminfo
)。
更新:Lars Wirzenius的回答有一个有用的背景概述。几年前,我还写了一篇关于终端的简短文章。
ncurses
是 curses
的一个免费重新实现,terminfo
已经基本完全取代了 termcap
。此外,ANSI 定义了一些“标准”序列,基于数字终端,并且几乎每个终端仿真器都使用这些序列,至少大多数是这样的,Linux 虚拟控制台就是其中之一。现在很少有人使用实际物理终端。ncurses
或 tput
命令可能最有用。或者您可以决定只清除整个屏幕(参见 clear
(1)),然后输出内容最简单。ncurses
是最好的选择。tput cuu1
查看 man terminfo
以获取更多选项。
但执行 shell 命令来移动光标是相当令人绝望的。
你可以使用键盘上的上下箭头来滚动控制台历史记录,但也有一个 history 命令。使用 man history 了解更多信息。