我需要在一直投影的屏幕上放置一个文本横幅。屏幕连接到带有 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
还支持一些其他特殊名称:-
EXIT
、DEBUG
、RETURN
和ERR
。
有关这些的更多文档可以在bash 参考手册。
答案2
如果我理解的话,你想要一个无限循环:
while :; do
sleep 1
clear
# the command: echo, toilet, etc.
done
也许,watch 的问题是在调用 watch 之前完成了一次 shell 扩展,$(command ..)
因此输出不会改变;将双引号改为单引号
watch --interval 1 'cowsay $(fortune)'