【问题标题】:Bash non scrolling terminal outputBash非滚动终端输出
【发布时间】:2013-07-31 11:25:19
【问题描述】:

一些程序以用户体验的方式向 bash 生成输出,例如更改值的字符串而不是打印的行(bash 向下滚动以显示所有更改的输出)。这种现象叫什么?它是如何在例如 java 程序或 bash 脚本中实现的。如何解析输出?它只是打印新行但使用一些特殊功能吗?

top 是一个使用这种输出数据“现象”的程序


使用了Okey光标。

那么我如何在 java 中解析它们呢?我试过这段代码,但它没有打印任何东西

public static void exeTest(String [] args) throws IOException{
        if (args.length <= 0) {
            System.out.println("empty command");
            return;
        }

       Process process = new ProcessBuilder(args).start();
       InputStream is = process.getInputStream();
       InputStreamReader isr = new InputStreamReader(is);
       BufferedReader br = new BufferedReader(isr);


       System.out.printf("Output of running %s is:", 
          Arrays.toString(args));
       String line;
       while ((line = br.readLine()) != null) {
            System.out.println(line);
       }

感谢所有好的答案,我现在对这个主题更加熟悉,即使你仍然无法解析像 java 中从顶部开始的程序输出。我会结束这个问题并做更多关于如何在java中解析它的研究。然后我可能会开始另一个更具体的关于在 java 中解析输出的内容。

【问题讨论】:

标签: java bash


【解决方案1】:

由于您已使用bash 标记问​​题,我假设您正在运行 linux/cygwin。因此,终端很可能与 ANSI 兼容。在这种情况下,您也可以使用ANSI escape sequences...

例如:

echo -e "Hello world\rHi"
# Produces "Hillo world" since the line is not cleared before printing "Hi".
echo -e "Hello world\r\e[KHi"
#produces "Hi" (prints "Hello world", goes to 1st column, clears to last column, prints "Hi")
# For more details, refer above link.

如果您需要循环运行它(这是最明显的情况),请确保

  1. 您不要在消息字符串后添加换行符,或者
  2. 您使用 ANSI 转义序列“\e[A”(或“\e[A”,其中 N= 行数)恢复垂直光标移动(由于“\n”)。李>

注意:

上面给出的这段代码是 bash 命令。抱歉,我对java语法不太熟悉,但据我所知,

  1. echo 会被翻译成System.out.println
  2. 使用System.out.printf 可以实现没有最后一个换行符的回声
  3. &\e&lt;ESC&gt;字符(ascii = 27),可以用java字符串中的\033实现。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 感谢您的回复,我现在的主要问题是解析 java 执行的进程的游标输出。当我开始我可以调用的过程时,getOutputStream,但没有什么像 get cursor
    【解决方案3】:

    可以按照您所说的方式完成,我的意思是打印新行。想象一下你有循环:

    String header = "Current val:";
    String buffer = "";
    for(int i = 0; i < val; i++) {
        buffer = header + " " + i + "\n";
        buffer += (val - i) + "iterations left\n";
        //add other strings to buffer...
        //Clear console here
        //Print buffer
    }
    

    所以随着变量的变化,输出看起来是静态的。

    其他更强大的方法是使用goto(x, y) 之类的函数进行精确输出操作。 Java 在标准 api 中没有,但有库。 Java gotoxy(x,y) for console applications

    【讨论】:

    • //清除控制台这里如何? “清除”(命令)?像top这样的程序是这样完成的吗?
    【解决方案4】:

    不要打印整行(如println 或打印%n),而是写退格字符(\b)或不带换行符的裸回车(\r)将光标移回您的前面想要打印出来。

    【讨论】:

    • (只是不要在你的IDE中做,它可能不支持它;))
    • 这听起来像一个骇人听闻的解决方案:/ 它真的是标准的吗?:S 而不是写 System.out.println(str) 我用 x \b\b\b 为 str.length 构建字符串编写...然后 str 然后使用 System.out.print 覆盖最后打印的行?如何解析? while(line.startswith(\b)) 首先删除...例如,如何构建一个从顶部解析 cpu 使用情况并在 swing gui 中显示的程序(我不这样做)
    • 这是一个骇人听闻的解决方案,但这是基本命令行程序的标准方式。任何更复杂的事情都需要像curses 这样的终端库,这几乎可以肯定是矫枉过正。没有标准的跨平台方式来“清除”终端或返回到前一行。输出对屏幕抓取不实用。
    猜你喜欢
    • 2022-01-20
    • 2015-08-10
    • 1970-01-01
    • 2014-07-24
    • 2015-08-04
    • 1970-01-01
    • 2014-11-30
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多