사용세게 때리다, 사용자 상호 작용 없이 터미널 응답을 변수로 읽는 방법은 무엇입니까? 다음 줄은 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
기능과 명령 옵션이 있습니다 . 일반적인 용도에서는 를 사용하지 않습니다 (예:-t
read
stty
dynamic.sh
):
stty raw -echo min 0 time 5
read
0.5초 내에 시간 초과되고 문자를 읽지 않고 반환될 수 있도록 터미널을 임시로 설정합니다 . 설정을 저장/복원하는 방법을 이해하려면 스크립트를 읽는 것이 도움이 됩니다.
추가 자료:
- 이것
vttests
scriptsxterm
, 그 중 다수는 터미널 응답 문자열을 읽습니다. stty
- 단말기 옵션 설정(POSIX)read
- 표준 입력에서 한 줄을 읽습니다.(POSIX)
답변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.