나는 이 질문이 여기에 질문되었기 때문에 모호하지 않다는 것을 알고 있습니다.지속적으로 업데이트됨(그리고반복됨여기).
내가 이루고 싶은 것은 조금 다르다. 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
신호를 무시합니다(이렇게 하면 문제가 해결됩니다).
결국 이것이 귀하가 요청한 대로 이루어지긴 하지만 귀하가 받는 순서는 약간 특이할 것입니다. 특히 히스토리가 별도로 로드되고 저장되면 다른 순서로 반복됩니다. 이것은 본질적으로 당신이 요구하는 것이지만, 이 시점에서는 위쪽 화살표 기록이 훨씬 덜 유용하다는 점에 유의하십시오.역사적 대체그러나 유사한 콘텐츠는 공유되고 잘 작동됩니다.