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
로 구분됩니다.);
그러면 다음 프롬프트가 표시되기 전에 기록이 저장됩니다. 프롬프트가 나올 때마다 이 작업을 수행해도 눈에 띄는 성능 저하가 발생하지 않을 수 있습니다.