한 터미널을 종료 할 때 다른 터미널의 bash 기록 업데이트 있기 때문에이 질문이 모호하지 않다는 것을 알고

나는이 질문이 계속 업데이트 되고 여기에 복제 되어 있기 때문에이 질문이 모호하지 않다는 것을 알고 있습니다.

내가 달성하려는 것은 약간 다릅니다. ls입력 할 때마다 파일을 다시 작성하라는 메시지가 마음에 들지 않습니다 ( history -a; history -c; history -r).

종료시 파일을 업데이트하고 싶습니다. 쉽지만 (실제로 기본값) 재 작성 대신 추가해야합니다.

shopt -s histappend

이제 터미널이 닫히면 열려있는 모든 다른 사람이 업데이트를 인식하도록하고 싶습니다.

나는 입력하는 $PS1모든 command것을 통해 확인하지 않고이 작업을 선호 합니다. 나는 일종의 신호를 포착하는 것이 더 좋을 것이라고 생각합니다. 어떻게 하시겠습니까? 가능하지 않다면 간단 cronjob할까요?

이 퍼즐을 어떻게 해결할 수 있습니까?



답변

창의적이고 관련된 신호라고 생각하십니까? 확인:

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 -nPROMPT_COMMAND. 아무 일도 일어나지 않으면 파일을 지속적으로 읽는 것을 저장하지 않으며 쉘이 끝날 때까지 전혀 글을 쓰지 않습니다.


그러나 여기에는 여전히 몇 가지 문제가 있습니다. 첫 번째는 기본 응답SIGUSR1 이 셸 을 종료 하는 것입니다. bash쉘 스크립트를 실행하는 다른 모든 프로세스는 종료됩니다. .bashrc비 대화식 쉘에 의해로드되지 않습니다. 대신에 의해 명명 된 파일 BASH_ENV이로드됩니다 . 환경에서 해당 변수를 전역 적으로 파일을 가리 키도록 설정할 수 있습니다.

trap '' USR1

그 안에있는 신호를 무시하기 위해 (문제를 해결합니다).

마지막으로 요청한 내용을 처리하지만 주문 순서는 약간 이례적입니다. 특히 히스토리 비트는 개별적으로로드 및 저장되므로 다른 순서로 반복됩니다. 그것은 본질적으로 당신이 요구하는 것에 내재되어 있지만, 위쪽 화살표 역사는 현재로서는 훨씬 덜 유용하다는 것을 알고 있습니다. 그러나 역사 대체 등은 공유되고 잘 작동합니다.