일반적인 시나리오:
내 호스트가 액세스를 차단한 파일에 일시적으로 액세스해야 합니다. vim을 실행하고 설정과 배경 vim을 편집하여 아파치에게 구성을 다시 로드하도록 지시합니다.
문제:
이제 이 사실을 잊어버리면 세션을 CTRL+D할 때 쉘에서 "작업이 중지되었습니다"라고 알려줄 것입니다. 하지만 ssh, tmux 등으로 인해 쉘에 쉘에 쉘을 두는 습관이 있기 때문에 작업을 마무리하고 창을 닫을 때 EOF를 반복적으로 보내는 경우도 많습니다. 이로 인해 경고에도 불구하고 실수로 쉘을 종료하게 됩니다.
그러한 포탄을 죽이는 것을 더 어렵게 만들 수 있습니까?
답변1
를 사용하는 경우 EOF를 종료 신호로 처리하기 전에 쉘이 무시해야 하는 연속 EOF 문자 수를 지정하는 숫자로 쉘 변수를 bash
설정할 수 있습니다 . IGNOREEOF
자세한 내용은 매뉴얼 페이지를 확인하세요.
그러나 "작업이 중지되었습니다"라는 메시지가 트리거되기 전에 트리거되므로 여전히 동일한 문제가 발생합니다. 해당 메시지가 표시되고 하나 더 ^D가 셸을 종료합니다.
대안은 해당 숫자가 0보다 큰 경우 프롬프트에 쉘 작업 수를 입력하는 것입니다.
예를 들어, 내 .bashrc에서 발췌한 내용은 다음과 같습니다.
PROMPT_COMMAND=prompt_command
prompt_command() {
job_count=$(jobs | wc -l)
if [ $job_count -gt 0 ] ; then
prompt_job="[$job_count] "
else
prompt_job=""
fi
}
PS1="...\${prompt_job}..."
그 후에 껍질은 다음과 같이 보일 수 있습니다...[1] ...
0보다 큰 경우 프롬프트에 작업 수가 표시됩니다. 이를 통해 완료되지 않은 작업이 있는 경우 쉽게 확인할 수 있으며 작업이 여전히 실행 중임을 시각적으로 상기시켜 주는 역할을 합니다.
답변2
이전 답변을 바탕으로 나는 이것을 생각해 냈습니다.
PROMPT_COMMAND=protect_bg_jobs
protect_bg_jobs()
{
if [ "$(jobs)" == "" ]; then
set +o ignoreeof
else
set -o ignoreeof
fi
}
"작업 중지가 있습니다"라는 메시지는 숨겨지지만 vim 버퍼는 저장됩니다.