터미널 응답 문자열을 변수로 읽어옵니다.

터미널 응답 문자열을 변수로 읽어옵니다.

사용세게 때리다, 사용자 상호 작용 없이 터미널 응답을 변수로 읽는 방법은 무엇입니까? 다음 줄은 Enter한 번만 눌러야 합니다.

echo -ne '\005' && read -s && echo ${REPLY}

또한 어떻게 구성하나요?Xterm의미 있는 응답을 보내시겠습니까 ^E? 지금까지 응답을 보내는 유일한 터미널 에뮬레이터는 다음과 같습니다.퍼티.

답변1

응답 문자열은 다음 명령을 사용하여 xterm에서 구성할 수 있습니다.answerbackString자원. 이 리소스는 다음에 추가되었습니다.1998년. "xterm"은 처음에 반환됩니다.1999년일부 사용자가 제어 시퀀스를 남용하여 컴퓨터에 예기치 않은 명령을 보낼 수 있다는 점을 지적했기 때문에 기본값은 빈 문자열입니다.

다른 터미널은 항상 빈 문자열(konsole, mlterm, vte)을 반환할 수 있습니다. 그러나 rxvt(및 rxvt-unicode)는 예상치 못한 응답인 VT102에 대한 장치 속성 응답(이스케이프 시퀀스)을 반환합니다. PuTTY는 "PuTTY"를 반환합니다.(아마도 xterm의 초기 영향 때문일 것입니다).

빠르게 확인해 보면 Linux 콘솔에 "a"(아마도 버그)가 표시됩니다.

원래 VT100은 이 기능을 설정/구성 가능한 기능으로 제공했기 때문에 다음으로 제한되었습니다.인쇄 가능수치. 따라서 rxvt/urxvt의 응답은 예상치 못한 것입니다. 매뉴얼 페이지에는 이에 대해 비밀스러운 설명이 나와 있습니다.

answerbackString:
ENQ(control-E) 문자가 전달될 때 rxvt-unicode가 셸에 보내는 응답을 지정합니다. 항목에 명시된 대로 이스케이프된 값을 포함할 수 있습니다.keysym다음과 같은.

(Promise에 대한 설명이 존재하지 않습니다.)

응답 문자열의 길이를 알 수 없으므로 이 문자열을 읽는 애플리케이션은 대기를 허용해야 합니다(문자가 여러 읽기 작업으로 도착하는 경우). 물론, 쉘 스크립팅에 도움이 될 수 있는 ksh/bash 관련 TMOUT기능과 명령 옵션이 있습니다 . 일반적인 용도에서는 를 사용하지 않습니다 (예:-treadsttydynamic.sh):

stty raw -echo min 0 time 5

read0.5초 내에 시간 초과되고 문자를 읽지 않고 반환될 수 있도록 터미널을 임시로 설정합니다 . 설정을 저장/복원하는 방법을 이해하려면 스크립트를 읽는 것이 도움이 됩니다.

추가 자료:

답변2

bash( )는 시간 초과 및 (특정) 읽을 문자 수에도 불구하고 version 4.2.46(1)-release저장에 실패할 수 있습니다 REPLY. 여기서는 "커서 위치 보고" 제어 시퀀스를 실행하고 먼저 개행 문자를 입력한 다음 시간 초과를 기다립니다.

$ 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
$ 

여기서 문제는 -n바이트 수가 반환된 것보다 크다는 것입니다. -n크기가 정확히 맞거나 작으면 입력(또는 시간 초과) 없이 응답을 읽을 수 있습니다. 응답 문자열의 마지막 고유 문자를 알고 있는 경우 문자 위치 힌트를 보고하기 위해 "줄"을 해당 문자로 분할하여 응답을 얻을 수 있습니다 R.

$ echo -ne '\033[6n' && read -n 999 -d R -s; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31                           .[24;1
$ 

알 수 없는 길이의 알 수 없는 입력이 있는 경우 이에 대해 오류를 제출하거나 bash시간 초과가 발생할 때까지 바이트를 하나씩 지루하게 조금씩 갉아먹어야 합니다.

$ 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
$ 

control+e내가 생각하는 것 때문에터미널은 무언가를 다시 보낼 수 있습니다하지만 그렇게 하려면 다음과 같이 구성해야 합니다.

ENQ       Return Terminal Status (Ctrl-E).  Default response is an empty
          string, but may be overridden by a resource answerbackString.

관련 정보