터미널 응답 문자열을 변수로 읽기

터미널 응답 문자열을 변수로 읽기

사용세게 때리다, 사용자 상호 작용 없이 터미널 응답을 변수로 어떻게 읽을 수 있습니까? 다음 단일 라이너는 여전히 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수행원.

(약속된 설명이 없습니다).

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

stty raw -echo min 0 time 5

a가 0.5초 안에 시간 초과되도록 터미널을 일시적으로 설정하고 read문자를 읽지 않고 반환되도록 허용합니다. 설정이 어떻게 저장/복원되는지 보려면 스크립트를 읽는 것이 도움이 됩니다.

추가 자료:

답변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.

관련 정보