Limpe a tela e mostre um banner

1

Eu preciso de um banner de texto em uma tela que é projetada o tempo todo. A tela está conectada a um PC com o tmux.

Exemplo de "banners" de texto:

figlet $(fortune)

ou

toilet "$(cowsay $(fortune))"

Você tem a ideia.

Inicialmente, achamos que esse banner precisaria de "recursos de regeneração" caso algo desse errado, por isso fizemos algo assim:

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

mas a coisa nunca caiu em um ano! ( uptime > 1 ano)

Então estamos simplificando e implantando em outro lugar também. Eu só quero um comando UNIX que faça o seguinte:

  • limpe a tela (como clear )
  • mostra uma string formatada (como printf )
  • é modal (como um ncurses app)

Eu comecei a escrever algo assim, tirado de um tutorial da web:

#include <ncurses.h>

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

mas isso não é "modal" (com modal sendo: desconsidere todas as entradas até CTRL + C) e eu posso estar "reescrevendo uma ferramenta existente".

Qual ferramenta UNIX você usaria no meu caso?

    
por Robottinosino 12.10.2012 / 07:39

2 respostas

2

O comando para procurar por Ctrl + C (o sinal INT) é trap .

#!bin/bash

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

while :
do
    sleep 60
done

Update - Outros sinais que podem ser capturados com armadilha

SIGINT - Ctrl-c
SIGQUIT - Ctrl- \ (isso irá encerrar o programa, mas os comandos no trap ainda serão executados)

SIGSTOP (Ctrl-z) não parece ser capturado pela armadilha.

trap também pode capturar sinais emitidos por kill , mas não tenho certeza de quantos deles podem ser capturados.

trap também suporta alguns outros nomes especiais: -% EXIT , DEBUG , RETURN e ERR .
Outras documentações podem ser encontradas no manual de referência bash .

    
por 12.10.2012 / 14:11
0

Se eu entendi, você quer um loop infinito:

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

Talvez, o problema com o watch é que a expansão do shell de $(command ..) é feita uma vez, antes que o watch seja chamado, a saída não muda; alterar aspas duplas para aspas simples

watch --interval 1 'cowsay $(fortune)'
    
por 12.10.2012 / 09:15