清空屏幕并显示横幅

清空屏幕并显示横幅

我需要在一直投影的屏幕上放置一个文本横幅。屏幕连接到带有 tmux 的 PC。

文本“横幅”示例:

figlet $(fortune)

或者

toilet "$(cowsay $(fortune))"

你明白了。

最初我们认为这个横幅需要“再生能力”,以防出现问题,所以我们做了这样的事情:

watch --interval 1 --no-title echo Paranoid about crashes, but I should not be

但这东西一年内从未崩溃过! ( uptime> 1 年)

因此,我们也在其他地方进行简化和部署。我只想要一个执行以下操作的 UNIX 命令:

  • 清除屏幕(如clear
  • 显示格式化的字符串(如printf
  • 是模态的(如ncurses应用程序)

我开始写这样的东西,摘自网络教程:

#include <ncurses.h>

int main(int argc, char** argv) {
  char* greeting = "Hello, world!";
  initscr();
  addstr(greeting);
  refresh();
  getch();
  endwin();
  return 0;
}

但这不是“模态”(模态是:忽略所有输入,直到 CTRL+C),我可能正在“重写现有工具”。

对于我的情况您会使用哪种 UNIX 工具?

答案1

监视 Ctrl+C(INT 信号)的命令是trap

#!bin/bash

MSG="Hello, world!"
trap "clear; echo -e $MSG" SIGINT SIGTERM

while :
do
    sleep 60
done

更新 - 其他可以用 trap 捕获的信号

SIGINT - Ctrl-c
SIGQUIT- Ctrl-\(这将退出程序,但 trap 中的命令仍将执行)

SIGSTOP(Ctrl-z) 似乎没有被陷阱捕获。

trap也可以捕获 发出的信号kill,但我不确定能捕获多少个。

trap还支持一些其他特殊名称:-
EXITDEBUGRETURNERR
有关这些的更多文档可以在bash 参考手册

答案2

如果我理解的话,你想要一个无限循环:

while :; do
  sleep 1
  clear
  # the command: echo, toilet, etc.
done

也许,watch 的问题是在调用 watch 之前完成了一次 shell 扩展,$(command ..)因此输出不会改变;将双引号改为单引号

watch --interval 1 'cowsay $(fortune)'

相关内容