닫히지 않은 IO 리소스는 다음 쉘 프롬프트에서 입력을 방해할 수 있습니다.

닫히지 않은 IO 리소스는 다음 쉘 프롬프트에서 입력을 방해할 수 있습니다.

때로는 하위 프로세스(예: Ruby 스크립트)를 생성하는 터미널 프로그램을 실행할 때 IO.popen하위 프로세스의 IO 핸들이 제대로 정리되지 않은 경우(예: IO.close) 프로그램이 종료되고 새 셸 프롬프트가 나타날 때, 터미널 입력이 제대로 작동하지 않는 것 같습니다.

예를 들어 화살표 키와 메타 또는 Ctrl 키는 키 입력을 수정하고 구성된 키 바인딩을 트리거하는 대신 이스케이프 시퀀스(예: ^[<key>)가 터미널 프롬프트에 출력됩니다. 예를 들어 <M-o>세 번 클릭하면 다음과 같습니다.

$ ^[o^[o^[o

이 상태에서 키를 누르면 <C-c>더 이상 이 문제가 없는 새 프롬프트가 생성됩니다. 그래서 이전 프로세스가 종료되었을 때 IO 리소스가 닫히지 않아 터미널이 이상한 상태에 있는 것 같습니다. 누군가 정확히 무슨 일이 일어나고 있는지 설명해 줄 수 있습니까?

답변1

이것은 xterm 및 bash처럼 들립니다. 이것기본 bash 구성메타모드가 설정되고 일부 프로그램은 이를 끄고(둘 다 이스케이프 시퀀스를 통해) bash에 내장된 재설정을 통해 이를 복원합니다.

다음 결과를 보내면 원하는 방식으로 작동하게 할 수 있습니다.

tput smm

프롬프트 문자열에(일반적으로 주의할 점은 문자열을 묶어야 하며 \[bash \]에게 문자열의 "너비"를 무시하도록 지시한다는 것입니다).

관련 정보