Cob*_*ast 3 php linux console formatting
我知道我可以回去并用它覆盖它的内容\r.
现在我怎样才能进入上一行来改变它?
或者甚至有办法打印到控制台窗口中的特定光标位置?
我的目标是使用PHP创建一些自我刷新的多线控制台应用程序.
Red*_*ick 10
使用ANSI转义码移动光标.例如:Esc [ 1 F.要将Escape字符放在字符串中,您需要以数字方式指定其值,例如"\ x1B [1F"
正如sujoy建议的那样,您可以使用PHP ncurses以更抽象的方式移动光标.
虽然大多数"控制台"允许ANSI转义码,但是其他类型的终端使用不同的字符序列,ncurses提供了终端独立的标准化API.如果您有兴趣,请快速查看/etc/termcap(然后man terminfo).
更新:Lars Wirzenius的回答有一个有用的背景摘要.几年前我还写了一篇关于终端的短文.
小智 7
Linux虚拟控制台模拟旧式显示终端,虽然不是很完美.有关硬件的示例,请参阅VT-100上的Wikipedia.
这些终端从串口读取数据,并将其显示在屏幕上.他们还在串行端口的输入流中查找特殊字节,并以其他方式对它们进行操作.例如,换行符('\n',字节值10)将转到下一行的开头,回车符('\ r',字节值13)将转到当前行的开头.
更有趣的是,ASCII ESC字节(27)将启动一个命令序列,该命令序列几乎可以与光标或显示有关.一个这样的序列可能会将光标移动到屏幕的左上角,另一个移动到给定的行和列.第三个可能会清除屏幕,第四个可能会使文本以反色显示.
每个终端制造商都会发明自己的命令序列(并且它们也不总是以ESC开头),然后根据他们可以使硬件的新版本做什么来改变它们.如果制造商添加了颜色或简单图形,则会产生新的序列.
将每个应用程序适应每个终端以及对命令序列的每次更改都是一项艰巨的任务.将其与将每个Web应用程序调整为新的浏览器版本进行比较.
像往常一样,解决方案是添加一个抽象层.在Unix中,调用了初始抽象termcap,包括文件/etc/termcap和读取文件的库.该文件将指定为每个终端模型的每个逻辑操作发送的实际命令序列.因此vt102终端模型会将操作"清除屏幕"映射到\033[2J.这允许应用程序员根据逻辑操作进行思考,这更简单.
当然,还不够简单...... termcap库并不像以前那么好,所以开发了另外两个库:curses提供了更高的抽象级别,包括用户输入,terminfo使终端定义和程序员使用它们更轻松.
在现代,ncurses是一个免费的重新实现,curses并terminfo已termcap完全取代.此外,ANSI已经定义了一些基于数字终端的"标准"序列,并且几乎每个终端仿真器都使用这些序列,至少大部分都是如此,而Linux虚拟控制台就是其中之一.很少有人拥有实际的物理终端.
对于你想要做的事情,ncurses或者tput命令可能是最有用的.或者你可以决定只清除整个屏幕(见clear(1))并写出输出是最简单的.