하지만 토마스 당나귀의 대답은 매우 정확, 스테판 Chazelas가 올바르게 변환이 돌에 설정되어 있지 않은지 당나귀의 대답에 코멘트에서 언급; 그것은 선 분야의 일부입니다.
실제로 번역은 완전히 프로그래밍 가능합니다.
사람 3 termios의의 man 페이지는 기본적으로 모든 관련 정보가 들어 있습니다. (링크는 Linux 전용 페이지 프로젝트 로 연결되는데,이 기능은 Linux 전용 기능과 POSIX 또는 기타 시스템에 공통적 인 기능을 언급합니다. 각 페이지에서 항상 준수 섹션을 확인 하십시오.)
iflag
(터미널 속성 old_settings[0]
의 질문에 표시된 코드에서 파이썬은 ) 모든 POSIXy 시스템에 세 개의 관련 플래그가 있습니다 :
INLCR
: 설정되면 입력시 NL을 CR로 변환합니다.
ICRNL
: 설정되어 있고 IGNCR
설정되지 않은 경우 입력에서 CR을 NL로 변환하십시오.
IGNCR
: 입력시 CR 무시
마찬가지로 관련 출력 설정 ( old_settings[1]
)도 있습니다.
OPOST
: 출력 처리를 활성화합니다.
OCRNL
: 출력에서 CR을 NL에 맵핑합니다.
ONLCR
: 출력에서 NL을 CR에 맵핑합니다. (XSI; 모든 POSIX 또는 Single-Unix-Specification 시스템에서 사용 가능하지는 않습니다.)
ONOCR
: 첫 번째 열에서 CR을 건너 뜁니다 (출력하지 않음).
ONLRET
: CR을 건너 뜁니다 (출력하지 않음).
예를 들어, tty
모듈에 의존하지 않아도됩니다 . "makeraw"연산은 플래그 세트를 지우고 (오프 래그를 설정합니다 CS8
) :
import sys
import termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
ch = None
try:
new_settings = termios.tcgetattr(fd)
new_settings[0] = new_settings[0] & ~termios.IGNBRK
new_settings[0] = new_settings[0] & ~termios.BRKINT
new_settings[0] = new_settings[0] & ~termios.PARMRK
new_settings[0] = new_settings[0] & ~termios.ISTRIP
new_settings[0] = new_settings[0] & ~termios.INLCR
new_settings[0] = new_settings[0] & ~termios.IGNCR
new_settings[0] = new_settings[0] & ~termios.ICRNL
new_settings[0] = new_settings[0] & ~termios.IXON
new_settings[1] = new_settings[1] & ~termios.OPOST
new_settings[2] = new_settings[2] & ~termios.CSIZE
new_settings[2] = new_settings[2] | termios.CS8
new_settings[2] = new_settings[2] & ~termios.PARENB
new_settings[3] = new_settings[3] & ~termios.ECHO
new_settings[3] = new_settings[3] & ~termios.ECHONL
new_settings[3] = new_settings[3] & ~termios.ICANON
new_settings[3] = new_settings[3] & ~termios.ISIG
new_settings[3] = new_settings[3] & ~termios.IEXTEN
termios.tcsetattr(fd, termios.TCSANOW, new_settings)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
호환성을 위해, 모든 상수가 termios 모듈에 먼저 존재하는지 확인하고 싶을 수도 있습니다 (POS가 아닌 시스템에서 실행하는 경우). 당신은 또한 사용할 수 있습니다 new_settings[6][termios.VMIN]
및 new_settings[6][termios.VTIME]
이 보류중인 데이터도없고, 시간 (0.1 초의 정수의) 경우 세트에 읽기가 차단할지 여부를 지정합니다. (일반적으로 VMIN
0 으로 설정되며, VTIME
읽기가 즉시 반환되어야하는 경우 또는 읽기가 최대 대기 시간을 양수 (10 초)로 설정합니다.)
보시다시피, 위의 (그리고 일반적으로 "makeraw")는 입력시 모든 번역을 비활성화합니다.
new_settings[0] = new_settings[0] & ~termios.INLCR
new_settings[0] = new_settings[0] & ~termios.ICRNL
new_settings[0] = new_settings[0] & ~termios.IGNCR
정상적인 동작을 얻으려면 해당 세 줄을 지우는 행을 생략하면 "원시"인 경우에도 입력 변환이 변경되지 않습니다.
이 new_settings[1] = new_settings[1] & ~termios.OPOST
줄은 다른 출력 플래그가 무엇을 말하는지에 관계없이 모든 출력 처리를 비활성화합니다. 출력 처리를 그대로 유지하려면 생략 할 수 있습니다. 이것은 raw 모드에서도 출력을 "정상"으로 유지합니다. (입력이 자동으로 반향되는지 여부에 영향을 미치지 않으며,의 ECHO
cflag에 의해 제어됩니다 new_settings[3]
.)
새로운 속성이 설정된 경우 경우 마지막으로, 호출이 성공 어떤 새로운 설정이 설정되었습니다. 설정이 민감한 경우 (예 : 명령 줄에서 암호를 요청하는 경우) 새 설정을 가져 와서 중요한 플래그가 올바르게 설정 / 설정 해제되었는지 확인해야합니다.
현재 터미널 설정을 보려면 다음을 실행하십시오.
stty -a
입력 플래그는 일반적으로 네 번째 행에 있고 다섯 번째 행에 출력 플래그가 있으며 -
, 플래그가 설정되지 않은 경우 앞에 플래그 이름이 표시됩니다. 예를 들어, 출력은
speed 38400 baud; rows 58; columns 205; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
의사 터미널 및 USB TTY 장치에서 전송 속도는 관련이 없습니다.
암호와 같은 Bash 스크립트를 작성하는 경우 다음 관용구를 고려하십시오.
#!/bin/bash
trap 'stty sane ; stty '"$(stty -g)" EXIT
stty -echo -echonl -imaxbel -isig -icanon min 1 time 0
EXIT
쉘이 종료 할 때마다 트랩이 실행됩니다. 는 stty -g
현재 설정을 할 때 스크립트가 종료, 자동으로 복원되도록, 스크립트의 시작 터미널의 현재 설정을 읽습니다. Ctrl+로 스크립트를 중단 할 수도 C있으며 올바른 작업을 수행합니다. (신호가있는 일부 모퉁이의 경우 터미널이 때로는 원시 / 비정규 설정 ( 터미널에서 입력 reset
+ Enter맹목적으로 설정해야 함 )으로 고정되어 있지만 stty sane
실제 원래 설정을 복원하기 전에 실행 하면 매번 그래서 그것이 존재하는 이유입니다; 일종의 안전성이 추가되었습니다.)
read
bash 내장을 사용하여 입력 행 (터미널에 대해 선택 취소)을 읽거나 문자를 사용하여 입력 문자를 읽을 수도 있습니다
IFS=$'\0'
input=""
while read -N 1 c ; do
[[ "$c" == "" || "$c" == $'\n' || "$c" == $'\r' ]] && break
input="$input$c"
done
IFS
ASCII NUL로 설정하지 않으면 read
내장 기능이 분리 기호를 사용하므로 c
비워집니다. 젊은 선수들을 위해 함정.