저는 현재 일부 Bash 스크립트를 작성하고 로그 정보를 반환하는 도구를 구축 중입니다. 그러나 스크립트는 때때로 네트워크에서 발생하는 상황에 따라 많은 줄을 반환하고 Ctrl+는 S인쇄된 줄을 읽을 수 있도록 출력을 "고정"하는 데 도움을 줍니다. XOFF
이 키 조합을 누르면 Bash는 Ctrl+를 누를 때까지 흐름 제어( )를 일시 중지한다고 읽었습니다 .Q
CtrlBash가 일시 중지되기 전에 +를 누르면 메시지를 인쇄할 수 있는 방법이 있나요 ?S
예를 들어, 사용자가 +를 누르면 CtrlBash가 출력을 일시 중지하기 전에 S유사한(또는 다른) 메시지가 나타납니까?Stopped - press Ctrl+Q to proceed
답변1
이 동작은 bash(또는 해당 문제에 대한 쉘)와 아무 관련이 없습니다. 터미널 장치 드라이버가 ^S
터미널에서 문자(또는 설정된 내용)를 받으면 출력을 일시 중지합니다(데이터를 터미널로 보내는 것을 중지합니다).stty stop
해당 터미널의 셸에서 시작된 응용 프로그램은 ^S
터미널 장치에서 읽는 경우에도 이 문자를 볼 수 없습니다.
셸은 터미널에서 실행되는 또 다른 애플리케이션일 뿐이며 해당 작업은 명령줄을 해석하고 별도의 프로세스에서 해당 명령을 실행하는 것입니다. 명령이 실행되는 동안 셸은 아무 작업도 수행하지 않고 명령이 완료되어 다른 명령을 묻는 메시지를 표시할 때까지 기다립니다.
실제로 최신 셸에는 bash
다음과 같은 상황에서 이 흐름 제어 프로세스를 비활성화하는 기능이 포함되어 있습니다.그들을(명령줄 편집기)을 사용하여 터미널 장치와 상호 작용합니다. bash 프롬프트를 누르고 모드 Ctrl+S에 있다고 가정하면 증분 검색 위젯 호출로 처리된다는 것을 알 수 있습니다.emacs
bash
Ctrl+S수정해야 할 것이 터미널 장치 드라이버(라인 규율)임을 누르면 여기에 메시지가 있습니다 . 단말기에서 보낸 것에 대한 답장을 보내는 것이 조금 어리석은 느낌이 들긴 하지만"보내지 마세요".
또 다른 접근 방식은 쉘 세션을 호스트 터미널 장치를 다음 위치에 배치하는 의사 터미널 래퍼로 래핑하는 것입니다.날것의bash
모드를 사용하고 이러한 ^S
문자를 가로채서 메시지를 작성하는 자체 의사 터미널 장치를 제공합니다 .
예를 들어 터미널 내의 터미널 에뮬레이터인 GNU 화면을 통해 이 작업을 수행할 수 있습니다.
다음에 추가하세요 ~/.screenrc
:
bindkey "\023" eval 'hstatus "Stopped - press Ctrl+Q to proceed"' xoff
bindkey "\021" eval "hstatus screen" xon
다음은 터미널의 하드 상태 줄에 표시되는 메시지입니다.