History -a 명령을 정기적으로 자동 실행하는 방법은 무엇입니까?

History -a 명령을 정기적으로 자동 실행하는 방법은 무엇입니까?

history -a저는 bash 쉘을 사용하고 있으며 가끔 수동으로 명령을 실행합니다. 나의 일반적인 쉘 세션은 몇 주 또는 몇 달 동안 지속되며 쉘 세션을 거의 종료하지 않습니다. 그래서 history -a가끔 현재 세션 기록을 강제로 bash_history에 기록하도록 합니다. history -a매일 주기적으로 실행되는 자동화 스크립트를 작성할 생각입니다 . 이를 달성하는 가장 좋은 방법은 무엇입니까?

답변1

하루에 한 번 이상 키를 누르면 ENTERPROMPT_COMMAND 기반 솔루션이 도움이 될 수 있습니다.

save_history_daily () {
  # if the current time is more than a day's-worth of seconds newer than
  # the modification time of $HISTFILE, then run 'history -a'

  if (( $(printf '%(%s)T' -1) - 86400 > $(stat -c %Y "$HISTFILE") ))
  then 
    history -a
  fi
}

PROMPT_COMMAND="$PROMPT_COMMAND
save_history_daily"

이는 bash 버전 bash-4.2-alpha 이상의 기능에 의존합니다 printf %(...)T. 여기서는 -1해당 인수를 사용하여 현재 시간(에포크 이후 초)을 검색합니다. 이전 bash 버전이 있는 경우 다음 을 호출하여 date이 비트를 바꿀 수 있습니다 $(date +%s). bash-5.0-alpha로 시작하는 Bash 버전에는 EPOCHSECONDS 변수를 사용할 수 있으며 이는 약간 더 효율적입니다.

PROMPT_COMMAND 할당에 개행 문자를 삽입하는 아이디어를 복사했습니다.Giles의 답변 중 하나;정의된 기존 값에 새 함수 호출을 추가합니다.

답변2

첫째, history실행되는 세션에 영향을 미치는 Bash 내장 명령입니다. 내가 아는 한, 아직 저장되지 않은 최근 명령을 저장하기 위해 다른 세션에서 기록 명령을 실행할 수 없습니다.

PROMPT_COMMAND한 가지 해결책은 모든 명령 항목에서 실행 되도록 환경 변수를 수정하는 것입니다 .history -a이 게시물도움이 될 수도 있습니다.

답변3

스크립트에서 셸 기록을 저장할 수 없습니다. 어쨌든 직접적으로는 아닙니다.

이것은 대체로 테스트되지 않은 아이디어입니다.

쉘은 대화형 쉘로 작동하든 비대화형 쉘로 작동하든 bash이 신호를 무시합니다 .QUIT

이는 신호를 포착하기 위해 트랩을 설치할 수 있음을 의미합니다 QUIT. 이는 대화형 셸 세션의 셸 시작 파일을 통해 수행할 수 있습니다(예: ~/.bashrc트랩은 간단히 다음을 호출합니다 history -a.

trap 'history -a' QUIT

그런 다음 이 신호를 QUIT셸 세션으로 보내 기록을 저장하도록 할 수 있습니다. 를 사용하면 pkill다음으로 보낼 수도 있습니다.모두 bash현재 실행 중인 세션:

pkill -QUIT -U "$LOGNAME" bash

이는 cron 작업을 통해 수행할 수 있습니다.

실제로 보는 것 외에는 어느 정도 테스트하지 않았습니다.나타나다일하고 있는. 유일한 문제는 ^\쉘의 프롬프트가 이런 식으로 신호를 보낸다는 것입니다. 난 그냥 해요가설많은 포탄이 역사를 보존한다면동시에, 혼합 쓰기를 방지하기 위해 현명한 방법으로 수행됩니다.


개인적으로 나는 아마도 history -a다음을 PROMPT_COMMAND대신 사용하기로 선택할 것입니다.

PROMPT_COMMAND+="${PROMPT_COMMAND:+;}history -a"

또는

PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}history -a"

(변수에 이미 null이 아닌 값이 있는 경우 history -a값에 추가되고 PROMPT_COMMAND로 구분됩니다.);

그러면 다음 프롬프트가 표시되기 전에 기록이 저장됩니다. 프롬프트가 나올 때마다 이 작업을 수행해도 눈에 띄는 성능 저하가 발생하지 않을 수 있습니다.

관련 정보