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


15

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

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

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

shopt -s histappend

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

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

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


1
zsh는이 작업을 즉시 수행하며 기록 공유를 미세 조정할 수있는 많은 옵션이 있습니다.
Gilles 'SO- 악마 그만해'

감사합니다 @Gilles; 재밌지 만 리눅스를 사용하는 몇 년 동안 나는 아무것도 시도하지 않았다 bash. 아마도 재미를 위해 새로운 것을 확인해야 할 때입니다.
Dr Beco

답변:


15

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

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

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

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


.bashrc파일 내에서 타임 스탬프를 활성화했는지 확인한 다음 cronjob과 같은 파일이 주기적으로 와서 파일을 주기적으로 가져 와서 시간별 SIGUSR1위쪽 화살표 기록을 다시 얻을 수 있는지 여부에 따라 스 니펫을 보냅니다 .
forquare

깔끔한 솔루션이지만 다른 프로세스는 USR1에서 종료됩니다. 이 동작은 USR2에서도 발생합니까?
Dr Beco

나는 놀랐 기 때문에 두 번째 의견을 추가 할 것입니다. 프로세스 관련 TERM을 USR1과 어떻게 연결합니까? USR1이 사용자 만 사용하는 것이 아닙니까? 이거 좀 linux bug?? 다른 프로세스가 USR1을 잡는 이유는 무엇입니까? (여기서 논의 할 의도는 없지만 올바른 장소에서 이것을 밝힐 것입니다)
Dr Beco

거의 모든 신호의 기본 동작은 종료입니다. POSIX에 지정되어 있습니다. 버그가 아닙니다. Bash를 사용하면 모든 프로세스에서 신호가 무시되도록 지정할 수 있으므로 목적에 적합합니다.
Michael Homer

감사합니다 @MichaelHomer. 이 사양 BASH_ENV이이 답변에 명시된대로 수행 되었습니까? 아니면이 악을 끄는보다 표준적인 방법을 알고 있습니까?
Dr Beco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.