나는 내 Mac의 bash 터미널에서 GNU/Linux 스타일 명령과 도구를 스스로 배우고 싶습니다.
백그라운드 프로세스가 완료되면 터미널이 자동으로 표시되도록 하고 싶습니다. 특정 프로그램을 실행하고 있지는 않지만 예를 들면 다음과 같습니다.
sleep 10 &
sleep
작업이 완료되면 명령줄에 자동으로 표시되도록 하려면 어떻게 해야 합니까(또는 가능합니까)? 아니면 수동으로 확인해야 합니까?
답변1
set +b
기본 모드. 이 모드에서는 bash
프롬프트가 인쇄될 때마다 먼저 백그라운드 작업이 중지되거나 종료되었는지 확인하고, 중지되거나 종료된 경우 프롬프트를 표시하기 전에 알림 메시지를 인쇄합니다.
set +b
모니터가 손상되지는 않지만 자체적인 문제가 있습니다. 특히 별도의 편집기 창에서 소스 코드를 편집 중인 GUI 프로그램을 테스트한다고 가정합니다. (통역된 언어로 작성되었다고 가정합니다.) 아마도 동일한 명령을 계속 입력하는 터미널 창이 있을 것입니다 myprogram &
. 프로그램을 변경하고 다시 시작하고 싶을 때마다 현재 인스턴스를 닫고 이 명령을 반복해야 합니다. 쉘 창에서. 이전 프로그램이 완료되었다는 알림을 인쇄하기 전에 이제 프로그램의 새 인스턴스 bash
가 시작됩니다. 해당 알림을 인쇄하는 것은 작업 번호 할당이 재설정되는 순간이기 때문에 의도적으로 작업 번호가 재설정되지 않는 한 작업 번호가 제한 없이 증가한다는 의미이기도 합니다. 백그라운드 없이 실행 작업이 실행되는 동안 Enter 키를 누르세요. 결국 프로그램 인스턴스가 중단되고 의도한 것 kill %134
보다 더 많은 내용을 입력해야 합니다 kill %1
.
set -b
이 모드에서는 백그라운드 작업이 중지되거나 종료되면 bash
SIGCHLD 신호를 수신하고 해당 신호 처리기는 bash
현재 포그라운드 프로세스가 완료되기를 기다리고 있는 경우에도 즉시 알림 메시지를 표시합니다.
set -b
터미널의 상태는 알 수 없으므로 알림으로 인해 실행 중인 전체 화면 응용 프로그램(예: 텍스트 편집기 또는 MUA)의 표시가 중단될 수 있습니다. 특히, 이 모드는 bash
자체 명령줄 편집기와 현명하게 상호 작용할 수도 없습니다! 이 모드에서 실행 해 보고 sleep 1 &
즉시 명령줄 입력을 시작하세요. 알림이 인쇄되면 디스플레이가 눈에 잘 띄지 않는 상태임을 알 수 있습니다.
그 근원이 모두 밝혀졌다여기.
답변2
기본적으로 bash
이는 일반적으로 명령 프롬프트가 표시될 준비가 되었을 때 백그라운드 작업의 상태가 변경되었음을 알리기 위해 설정됩니다.
이 동기 알림을 비동기식으로 활성화할 수 있습니다 set -b
. 그러나 단점이 없는 것은 아닙니다. 예를 들어 현재 명령을 입력하고 있는 경우 커서 줄 위치에 대한 개념이 없습니다.
그런데 명령줄 도구를 배울 때 Mac에 설치된 도구와 GNU/Linux 배포판에 동일한 이름을 가진 도구 사이에는 미묘한(때로는 그다지 미묘하지 않은) 차이가 있다는 점을 알아두십시오.