【问题标题】:is there a linux program to continuously run another program without flicker?有没有一个linux程序可以连续运行另一个程序而不闪烁?
【发布时间】:2017-01-20 09:57:21
【问题描述】:

我想在无限循环中一次又一次地运行命令行程序。
程序偶尔会输出不同的数据。

每当输出新数据时,我希望之前的数据被覆盖。

示例:
以下程序将输出一天中的时间。

#include <stdio.h>
#include <time.h>

int main (){
  time_t rawtime;
  struct tm * timeinfo;
  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  printf ( "Current local time and date: %s", asctime (timeinfo) );
}

天真的方法如下:

while true; do ./main; clear; done

当然,这会在每次运行时清除屏幕,并导致闪烁。

我当然可以将它通过管道传输到仅在更改时刷新输出的自定义程序中,
但我希望找到使用标准 linux 命令的解决方案
(或 Bash 语言功能)。

程序输出可以是多行的,所以不能返回(/r) 和重写。

【问题讨论】:

  • 不是你问的那样,但如果你被允许修改原始程序,你可以让它自己清除行。这可以避免闪烁,因为它只在有新输出要打印时才会这样做(并且您可以控制它何时刷新)。这就是“替换”输出行的命令行程序的工作方式:stackoverflow.com/questions/1508490/…
  • @ChrisKitching 我正在寻找任何程序的替代品。例如,我也可以将它与ls 一起使用。它可以通过管道完成,或者程序可以将另一个程序名称作为参数。什么都行。也可以多行输出!
  • 你能试试watch --interval=1 --no-title ./main 吗?不完全相同,但可能足够接近?
  • @fvu 效果很好。
  • 好吧,如果@GöranUddeborg 将它们整合到他的答案中那就太好了,不是吗? :)

标签: linux bash shell terminal command


【解决方案1】:

应该这样做:

while true; do LINE=$(date) | echo -en "\r$LINE"; done

date 替换为感兴趣的程序,但它是一个很酷的演示。

以这种方式使用管道可防止在有新输出要打印之前进行清除,并使清除和打印新输出一步完成。

警告:如果something 打印多行,这将无法正确清除。 另一方面,它不会像 watchclear 那样对整个终端屏幕进行核弹。

【讨论】:

    【解决方案2】:

    如果你有可用的命令watch,你可以使用它。只需输入

    watch ls
    

    【讨论】:

    • 您可能想要集成我的 cmets,我认为与它们一起输出更接近 OP 可能会关注的内容。
    • @fvu 是的,你的评论更合适。 watch 是解决方案。 --no-title 是首选。如果忽略间隔,它似乎会尽可能频繁地更新,但稍后添加间隔可能会有所帮助。谢谢。
    • @TrevorHickey 这很奇怪 - 我在这里使用 watch --no-title date 在 Centos 机器上进行了测试,看起来刷新每两秒发生一次,这就是我添加间隔的原因。也许它依赖于发行版?
    • watch 的 Fedora 版本也每秒更新一次。 :) 它记录在手册页中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多