일부 명령줄 인터페이스 도구는 취소 시 손상된 콘솔을 반환합니다 CTRL+C
. 때로는 명령을 실행하기 전에 텍스트가 표시되지 않거나 그래픽 문제가 있을 수 있습니다 reset
.
(저는 bash를 사용하지만 쉘 독립적이기를 원합니다.)
이 효과에 이름이 있나요? 이 문제의 원인은 무엇이며 프로그래머는 도구에서 이러한 일이 발생하지 않도록 어떻게 방지할 수 있습니까? 주요 프로그래밍 언어에는 이 문제를 해결하기 위한 전략이 있습니까?
답변1
콘솔에는 때때로reset(1)
(또는 일부stty(1)
명령) 프로세스(예: 쉘에 의해 시작된 프로그램)가 종료될 때 의사 터미널의 상태가 변경되지 않기 때문입니다.
읽다tty가 공개됐다.
(나는 그 취급을 발견의사 터미널pseudotty는 Linux에서 가장 어려운 부분입니다)
주요 프로그래밍 언어에는 이 문제를 해결하기 위한 전략이 있습니까?
터미널을 처리하고 모드나 회선 규칙을 변경하는 올바르게 작동하는 프로그램은 충돌을 피하고 적절한 호출을 발행하도록 노력해야 합니다(참조용어(3)) 터미널을 올바른 상태로 설정합니다. 그런데 도서관 같은 곳은저주또는독서선매우 도움이 됩니다(그러나 정리 루틴을 적절하게 호출해야 합니다).
바라보다신호(7)그리고신호 보안(7). 코드 충돌을 피하는 것은 어렵습니다. 읽다정의되지 않은 동작.
불완전한 해결 방법은 프로그램을 실행하는 셸 함수를 정의한 다음 실행하는 것입니다 reset
(때로는 부적절할 수 있음).
답변2
이 문제를 해결하는 것은 완전히 쉘 독립적이지 않습니다. zsh에는 ttyctl
tty 모드를 "고정" 또는 "고정 해제"할 수 있는 내장 기능이 있습니다 . Bash에는 비슷한 것이 없다고 생각합니다. tcsh의 명령은 setty
동일한 작업을 수행하지만 더 세분화되어 개별 설정을 고정할 수 있습니다.
tty 모드를 동결한다는 것은 단순히 zsh가 현재 모드를 기억하고 향후 하위 프로세스가 이를 변경하는 경우 하위 프로세스가 중단되거나 종료될 때 모드가 복원된다는 것을 의미합니다.
이렇게 하면 충돌이 발생하거나 터미널을 정리하지 못하는 프로그램의 일부 악영향으로부터 사용자를 보호할 수 있습니다. 를 사용하여 변경하려면 stty
해동하는 것을 기억해야 합니다. 그렇지 않으면 쉘이 stty
사용자가 수행한 모든 작업을 즉시 취소합니다.
reset
복구 stty
모드뿐만 아니라 가끔 필요할 수도 있지만 자주는 아닙니다.