O que você está perdendo é que a maioria das descrições de terminal ( linux
é minoria aqui, devido ao uso difundido de strings codificadas em .inputrc
) usa modo de aplicação para teclas especiais . Isso faz com que as teclas de cursor mostradas por tput
e infocmp
sejam diferentes daquelas que seu terminal (não inicializado) envia. aplicações curses sempre inicializam o terminal, e a base de dados do terminal é usada para esse propósito.
dialog
tem seus usos, mas não aborda diretamente essa questão. Por outro lado, é complicado (tecnicamente factível , raramente feito ) fornecer uma solução apenas bash. Geralmente usamos outras linguagens para fazer isso.
O problema com a leitura de chaves especiais é que elas geralmente são múltiplos bytes, incluindo caracteres estranhos como escape e ~ . Você pode fazer isso com o bash, mas então você tem que resolver o problema de determinar portavelmente qual chave especial era essa.
dialog
manipula a entrada de teclas especiais e assume (temporariamente) sua exibição. Se você realmente quer um programa de linha de comando simples, isso não é dialog
.
Aqui está um programa simples em C que lê uma chave especial e a imprime em imprimível (e portátil):
#include <curses.h>
int
main(void)
{
int ch;
const char *result;
char buffer[80];
filter();
newterm(NULL, stderr, stdin);
keypad(stdscr, TRUE);
noecho();
cbreak();
ch = getch();
if ((result = keyname(ch)) == 0) {
/* ncurses does the whole thing, other implementations need this */
if ((result = unctrl((chtype)ch)) == 0) {
sprintf(buffer, "%#x", ch);
result = buffer;
}
}
endwin();
printf("%s\n", result);
return 0;
}
Supondo que isso seja chamado de tgetch
, você o usaria em seu script da seguinte forma:
case $(tgetch 2>/dev/null) in
KEY_UP)
echo "got cursor-up"
;;
KEY_BACKSPACE|"^H")
echo "got backspace"
;;
esac
Leitura adicional:
- As teclas do meu cursor não funcionam (FAQ do ncurses)
-
dialog
- Widgets de curses orientados por script (aplicativo e biblioteca) - nome-chave / nome_da_chave