의사 터미널 슬레이브 파일을 열고 xterm
실행 tty
하고 봅니다(하나라고 가정 /dev/pts/0
). 그런 다음 다른 것을 열고 xterm
실행하십시오.
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo
/bin/sleep 1000
그런 다음 먼저 xterm에서 실행하십시오. 그런 다음 stty
두 번째 xterm에서 동일한 명령을 다시 실행하십시오.
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8
sleep
그런 다음 첫 번째 xterm에서 명령을 종료합니다 . 그런 다음 stty
두 번째 xterm에서 동일한 명령을 다시 실행하십시오.
$ stty -F /dev/pts/0
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo
bash는 명령을 실행하기 전에 tty 속성을 변경하고 명령을 실행한 후에 이를 복원하는 것을 볼 수 있습니다. bash 문서의 어디에 설명되어 있습니까? 모든 tty 속성이 복원됩니까, 아니면 프로그래밍 방식으로 변경된 경우 일부 속성이 복원되지 않을 수 있습니까?
답변1
readline(3)
이것은 일반적으로 bash의 일부로 정적으로 구축되지만 다른 프로그램에서도 사용되는 줄 편집 라이브러리 입니다 .
사용자의 명령을 읽기 시작할 때마다 readline은 터미널 설정을 저장하고 터미널을 "원시" 모드 [1]로 설정하여 삽입 지점을 왼쪽과 오른쪽으로 이동하고 readline(3)
반환할 때 기록에서 명령을 호출합니다(예: 사용자가 Enter를 누르면) 터미널의 원래 설정이 복원됩니다. Readline은 신호를 망칠 수도 있습니다.수수께끼 같은 행동.
를 strace하는 경우 ( whichimplements ) 및 ( ) bash
를 찾으십시오 . bash를 실행하면 터미널 설정이 유지되는 것을 알 수 있습니다 .ioctl(TCSETS*)
tcsetattr(3)
ioctl(TCGETS)
tcgetattr(3)
stty(1)
--noediting
[1] 정확히 "원시" 모드는 아니지만 cfmakeraw(3)
구체적인 세부 정보를 볼 수 있습니다.여기. 이러한 모든 터미널 설정은 termios(3)
맨페이지에 문서화되어 있습니다.