Usandofesta, como posso ler a resposta do terminal em uma variável sem interação do usuário? A seguinte linha ainda precisa Enterser pressionada uma vez:
echo -ne '\005' && read -s && echo ${REPLY}
Além disso, como posso configurarXtermenviar algo significativo em resposta a ^E
? Até agora, o único emulador de terminal que vi enviando resposta éMassa.
Responder1
A string de resposta é configurável no xterm usando oanswerbackString
recurso. Esse recurso foi adicionado em1998. Retornando inicialmente "xterm", já que1999o padrão é uma string vazia porque alguns usuários notaram o potencial de abuso de sequências de controle que podem enviar um comando inesperado ao computador.
Outros terminais podem sempre retornar uma string vazia (konsole, mlterm, vte). Mas rxvt (e rxvt-unicode) retornam uma resposta inesperada: o dispositivo atribui resposta para VT102 (uma sequência de escape). PuTTY retorna "PuTTY"(provavelmente devido à influência inicial do xterm).
Numa verificação rápida, o console do Linux exibe um “a” (provavelmente um bug).
Como o VT100 original fornecia isso como um recurso de configuração/configuração, isso teria sido limitado aimprimívelpersonagens. Por esse motivo, a resposta do rxvt/urxvt é inesperada. A página de manual faz um comentário obscuro sobre isso:
answerbackString
:corda
Especifique a resposta que o rxvt-unicode envia para o shell quando um caractere ENQ (control-E) é passado. Pode conter valores de escape conforme descrito na entrada emkeysym
seguindo.
(a descrição prometida está ausente).
Como o comprimento da string de resposta é desconhecido, uma aplicação que a lê deve permitir espera (caso os caracteres cheguem em mais de uma operação de leitura). É claro que existe o TMOUT
recurso específico do ksh/bash que pode ajudar com scripts de shell, junto com a -t
opção do read
comando. Para uso geral, evito isso, usando stty
, por exemplo, (vejadynamic.sh
):
stty raw -echo min 0 time 5
para configurar temporariamente o terminal para que a read
atinja o tempo limite em 0,5 segundos e permita que ele retorne sem ler nenhum caractere. Para ver como as configurações são salvas/restauradas, é útil ler o script.
Leitura adicional:
- o
vttests
scripts emxterm
, muitos dos quais leem strings de resposta do terminal. stty
- definir as opções para um terminal(POSIX)read
- leia uma linha da entrada padrão(POSIX)
Responder2
Mesmo com um tempo limite e (algum) número de caracteres a serem lidos, aparece bash
( version 4.2.46(1)-release
) pode não salvar o REPLY
, aqui emitindo a sequência de controle "Report Cursor Position", primeiro com uma nova linha inserida e depois aguardando o tempo limite:
$ echo -ne '\033[6n' && read -n 16 -s -t 3; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31 52 .[24;1R
$ echo -ne '\033[6n' && read -n 16 -s -t 3; echo -n $REPLY | xxd
$
O problema aqui é que -n
é maior que o número de bytes retornados; se -n
, em vez disso, for exatamente do tamanho certo ou menor, a resposta será lida sem a necessidade de entrada (ou tempo limite). Se você conhece um caractere final exclusivo da string de resposta, poderá obter uma resposta dividindo as "linhas" por esse caractere; para o prompt de posição do caractere do relatório, esse delimitador pode ser considerado R
:
$ echo -ne '\033[6n' && read -n 999 -d R -s; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31 .[24;1
$
Dada a entrada desconhecida de comprimento desconhecido, você teria que registrar um bug bash
ou talvez mordiscar os bytes, um por um, até que o tempo limite fosse acionado:
$ out="got "; echo -ne '\033[6n'; while read -n 1 -s -t 1; do out="$out$REPLY"; done
$ echo -n $out | xxd
0000000: 676f 7420 1b5b 3234 3b31 52 got .[24;1R
$
Para a control+ecoisa que eu suponhoum terminal poderia enviar algo de volta, mas teria que ser configurado para fazer isso:
ENQ Return Terminal Status (Ctrl-E). Default response is an empty
string, but may be overridden by a resource answerbackString.