한 터미널을 종료할 때 다른 터미널의 bash 기록 업데이트

한 터미널을 종료할 때 다른 터미널의 bash 기록 업데이트

나는 이 질문이 여기에 질문되었기 때문에 모호하지 않다는 것을 알고 있습니다.지속적으로 업데이트됨(그리고반복됨여기).

내가 이루고 싶은 것은 조금 다르다. ls( )를 입력할 때마다 history -a; history -c; history -r파일을 다시 작성하라는 메시지가 표시되는 것이 마음에 들지 않습니다 .

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

shopt -s histappend

이제 하나의 터미널이 닫히면 열려 있는 다른 모든 터미널이 업데이트에 대해 알 수 있기를 바랍니다.

$PS1나는 내가 입력한 모든 내용을 확인하지 않고 command이 작업을 수행하는 것을 선호합니다 . 어떤 종류의 신호를 포착하는 것이 더 나을 것이라고 생각합니다. 당신은 무엇을 할 것인가? 가능하지 않다면 간단한 것일까요 cronjob?

이 문제를 어떻게 해결할 수 있나요?

답변1

창의적이고 참여적인 신호를 말씀하시나요? 좋아요:

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우리는:

  • 기록 파일의 모든 새 항목을 셸의 메모리 내 기록 목록에 로드합니다.

Bash가 신호를 처리하는 방식으로 인해 Enter실제로 다음 클릭까지 새로운 기록 데이터를 얻을 수 없으므로 이는 입력보다 낫지 않습니다.history -n입력하다 PROMPT_COMMAND. 그러나 아무 일도 일어나지 않으면 파일을 계속 읽고 쉘이 종료될 때까지 전혀 쓰지 않습니다.


그러나 여기에는 여전히 몇 가지 문제가 있습니다. 첫 번째는기본 응답 SIGUSR1은 종료입니다.껍데기. 다른 모든 bash프로세스(예: 쉘 스크립트 실행)는 종료됩니다. .bashrc비대화형 쉘에서는 로드되지 않습니다. 대신에,이름이 지정된 BASH_ENV파일: 전역 환경에서 이 변수가 파일을 가리키도록 설정할 수 있습니다.

trap '' USR1

신호를 무시합니다(이렇게 하면 문제가 해결됩니다).

결국 이것이 귀하가 요청한 대로 이루어지긴 하지만 귀하가 받는 순서는 약간 특이할 것입니다. 특히 히스토리가 별도로 로드되고 저장되면 다른 순서로 반복됩니다. 이것은 본질적으로 당신이 요구하는 것이지만, 이 시점에서는 위쪽 화살표 기록이 훨씬 덜 유용하다는 점에 유의하십시오.역사적 대체그러나 유사한 콘텐츠는 공유되고 잘 작동됩니다.

관련 정보