[code:22teid0c]
#$HOME/.bashrc
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=1000
HISTTIMEFORMAT="%T "
_bash_history_sync() {
builtin history -a
HISTFILESIZE=$(eval echo $HISTSIZE)
builtin history -c
builtin history -r
}
export PROMPT_COMMAND="_bash_history_sync"
[/code:22teid0c]
history 명령시에 자동으로, 변경사항을 저장하고, 다시 읽어들입니다.
이러면, 세션별로 히스토리가 저장되는것이 아니라, 모두 하나의 히스토리를 갖게 되죠.
그러나 이런 방법에 단점도 있습니다.
터미널별로 바로 전 명령을 바로 접근할 수 없다는 것입니다.
이에 따라 다음과 같은 절충안을 생각해 볼 수 있습니다.
[code:22teid0c]
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=10000
HISTTIMEFORMAT="%T "
historyg() {
ps -o pid= -o user= -C bash|awk -v u=$USER ‘$2~u{print $1}’|xargs kill -USR2
local HISTSIZE=10000
local HISTFILESIZE=10000
builtin history -c
builtin history -r
builtin history "$@"
}
trap ‘builtin history -a’ USR2
[/code:22teid0c]
매번 history접근시마다, 동기화를 하지 않고, historyg 명령이 있을 경우,
USR2시그널을 사용자의 bash 프로세스에 전달하며, 각 프로세스는 자신의 현재 히스토리를 저장합니다.
이렇게 되면 현재 세션에서는 바로 전체 히스토리가 적용되지만, 이후에는 세션자체의 히스토리만 사용됩니다.
다른세션은 변함이 없는 상태에서, historyg명령을 함으로써 전체히스토리를 적용할 수 있습니다.
즉, historyg명령은 전체히스토리를 현재세션에 적용하라는 명령이라 볼 수 있습니다.