CTRL + C 후에 콘솔을 재설정해야하는 이유


9

에 의해 취소되면 일부 명령 행 인터페이스 도구가 깨진 콘솔을 반환합니다 CTRL+C. 때로는 텍스트가 보이지 않거나 명령을 실행할 때까지 그래픽 문제가 있습니다 reset.

(bash를 사용하지만 셸과 독립적이라고 생각합니다.)

이 효과의 이름이 있습니까? 이 문제의 원인은 무엇이며 프로그래머가 도구에서이를 방지하는 방법은 무엇입니까? 주요 프로그래밍 언어에서이 문제를 해결하는 전략이 있습니까?



stty sane회색 수염에 대한
Thorbjørn Ravn 안데르센

답변:


14

콘솔 화면은 때때로 필요 reset(1) (또는 stty(1)일부 프로세스를 종료 (예를 들어, 프로그램이 쉘에 의해 시작) 할 때 의사 단말기의 상태가 변경되지 않기 때문에 명령).

tty demystified를 읽으십시오 .

(나는 의사 터미널의사를 다루는 것이 리눅스에서 가장 어려운 부분이라고 생각한다)

주요 프로그래밍 언어에서이 문제를 해결하는 전략이 있습니까?

터미널을 다루고 모드 또는 회선 규율을 변경하는 올바르게 작동하는 프로그램은 충돌을 피하고 터미널을 올바른 상태 로 만들기 위해 적절한 호출 ( termios (3) 참조 )을 시도해야합니다 . BTW, ncurses 또는 readline 과 같은 라이브러리 가 유용하지만 정리 루틴을 적절하게 호출해야합니다.

signal (7)signal-safety (7)을 참조하십시오 . 코드 충돌을 피하는 것은 어렵습니다. 정의되지 않은 동작 에 대해 읽으십시오 .

불완전한 해결 방법은 프로그램을 실행하는 쉘 함수를 정의한 다음 reset(때로는 부적절 할 수 있는) 쉘 함수를 정의하는 것 입니다.


그 해결 방법은 좋지 않습니다. 때로는 원래 설정 reset과 다른 stty설정 이 발생할 수 있습니다 .

예, 지적 해 주셔서 감사합니다. 나는 "불완전하다"고 덧붙였다.
Basile Starynkevitch

귀하의 링크를 읽었으며 흥미로 웠지만이 Q / A 섹션에 대한 포인터를 추가 할 수 있다면 도움이 될 것입니다. tty demystified를 읽은 후 stty -a > /tmp/test1bash에서 시작한 다음 명령을 취소했습니다. 이제 터미널 색상이 빨간색이었습니다. stty -a > /tmp/test2하지만 test1test2동일했다.
조나스 스타 인

1

이 문제에 대응하는 것은 완전히 쉘 독립적이지 않습니다. zsh ttyctl에는 tty 모드를 "고정"또는 "고정 해제"할 수 있는 내장 기능이 있습니다. bash에는 동등한 것이 없다고 생각합니다. settytcsh 의 명령은 동일한 작업을 수행하지만보다 세분화 된 : 개별 설정을 고정 할 수 있습니다.

tty 모드를 정지한다는 것은 zsh가 현재 모드를 기억한다는 것을 의미하며, 미래의 일부 하위 모드가 변경되면 하위 모드가 일시 중지되거나 종료 될 때 모드가 복원됩니다.

이렇게하면 터미널이 손상되거나 그렇지 않으면 터미널 정리에 실패하는 프로그램의 일부 나쁜 영향으로부터 보호 할 수 있습니다. 로 변경하려면 고정을 stty해제해야합니다 stty. 그렇지 않으면 쉘이 수행 한 작업을 즉시 취소합니다 .

reset복원 stty모드 이상의 기능을 수행 하므로 가끔 필요할 수도 있지만 자주는 아닐 수도 있습니다.


실제로 : bash에서 stty -a> / tmp / test1을 시작한 다음 명령을 취소했습니다. 이제 터미널 색상이 빨간색이었습니다. stty -a> / tmp / test2이지만 test1과 test2는 정확히 동일합니다. 나는 tcsh로 같은 것을 시도했지만 CTRL + C로 명령을 충돌시킬 수 없었습니다. 색상이 잘 유지되었습니다.
조나스 스타
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.