回去在Linux控制台中的一条线?

我知道我可以回去,并用\r覆盖它的内容。
现在我怎么能进入前一行来改变呢?
还是有甚至有一种方法来打印到控制台窗口中的特定光标位置?

我的目标是用PHP创build一些自我刷新的多线控制台应用程序。

Solutions Collecting From Web of "回去在Linux控制台中的一条线?"

使用ANSI转义码移动光标。 例如: Esc [ 1 F 要将Escape字符放在字符串中,您需要用数字方式指定其值,例如“\ x1B [1F”

正如sujoy所建议的那样 ,您可以使用PHP ncurses以更抽象的方式移动光标。

虽然大多数“控制台”允许ANSI转义码,但其他类型的终端使用不同的字符序列, ncurses提供了一个独立于终端的标准化API。 如果您有兴趣,请快速浏览/etc/termcap (然后查看man terminfo )。

更新: Lars Wirzenius的答案有一个有用的背景总结。 几年前我也写了一篇关于终端的短文。

Linux虚拟控制台模拟旧式的显示终端,虽然不完美。 有关硬件的示例,请参阅VT-100上的维基百科 。

这些终端从串口读取数据,并将其显示在屏幕上。 他们还从串口查找输入流中的特殊字节,并以其他方式对其进行操作。 例如,换行符('\ 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)),然后写输出是最简单的。

我的目标是用PHP创建一些自我刷新的多线控制台应用程序

对于你正在努力实现ncurses是要走的路。

你应该阅读关于ncurses。 在shell中,你可以通过以下方式排队:

 tput cuu1 

查看man terminfo获取更多选项。 但执行shell命令来移动光标是相当绝望的。

你只要你键盘上的上下箭头滚动浏览控制台的历史记录,但也有历史命令。 了解更多使用男人的历史