창의적이고 관련된 신호라고 생각하십니까? 확인:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
에 있음을 척 .bashrc
하고 이동합니다. 신호를 사용하여 bash
다른 프로세스가 종료 될 때 모든 프로세스에 새 내역 항목을 확인하도록 지시합니다. 이것은 꽤 끔찍하지만 실제로 작동합니다.
어떻게 작동합니까?
trap
시스템 신호 또는 Bash의 내부 이벤트 중 하나에 대한 신호 처리기 를 설정 합니다. EXIT
동안 이벤트는, 쉘의 제어 종료입니다 USR1
입니다 SIGUSR1
, 우리가 차용하고 의미없는 신호.
껍질이 나올 때마다 :
- 모든 히스토리를 파일에 명시 적으로 추가하십시오.
SIGUSR1
핸들러를 비활성화 하고이 셸 이 신호를 무시 하도록합니다.
bash
동일한 사용자로부터 실행중인 모든 프로세스에 신호를 보냅니다 .
A는시 SIGUSR1
도착, 우리는 :
- 히스토리 파일의 모든 새 항목을 쉘의 메모리 내 히스토리 목록으로로드하십시오.
당신이 나오기 전까지 방식 때문에 배쉬 핸들 신호, 당신은 실제로 새로운 기록 데이터를받지 않습니다 Enter다음 번에이 퍼팅보다 더 나은이 전면에하지 않도록, history -n
에 PROMPT_COMMAND
. 아무 일도 일어나지 않으면 파일을 지속적으로 읽는 것을 저장하지 않으며 쉘이 끝날 때까지 전혀 글을 쓰지 않습니다.
그러나 여기에는 여전히 몇 가지 문제가 있습니다. 첫 번째는 기본 응답SIGUSR1
이 셸 을 종료 하는 것입니다. bash
쉘 스크립트를 실행하는 다른 모든 프로세스는 종료됩니다. .bashrc
비 대화식 쉘에 의해로드되지 않습니다. 대신에 의해 명명 된 파일 BASH_ENV
이로드됩니다 . 환경에서 해당 변수를 전역 적으로 파일을 가리 키도록 설정할 수 있습니다.
trap '' USR1
그 안에있는 신호를 무시하기 위해 (문제를 해결합니다).
마지막으로 요청한 내용을 처리하지만 주문 순서는 약간 이례적입니다. 특히 히스토리 비트는 개별적으로로드 및 저장되므로 다른 순서로 반복됩니다. 그것은 본질적으로 당신이 요구하는 것에 내재되어 있지만, 위쪽 화살표 역사는 현재로서는 훨씬 덜 유용하다는 것을 알고 있습니다. 그러나 역사 대체 등은 공유되고 잘 작동합니다.