Lendo a string de resposta do terminal em uma variável

Lendo a string de resposta do terminal em uma variável

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 oanswerbackStringrecurso. 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 emkeysymseguindo.

(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 TMOUTrecurso específico do ksh/bash que pode ajudar com scripts de shell, junto com a -topção do readcomando. 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 readatinja 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:

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 bashou 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.

informação relacionada