비슷한 질문이 있습니다여기, 하지만 다른 목표를 달성하고 싶습니다. 세션 간에 기록을 공유하고 싶지만서로 다른 세션에서 실행되는 명령을 혼합할 필요가 없습니다.
예를 들어 A와 B라는 두 개의 셸 세션이 있다고 가정해 보겠습니다. A에 몇 가지 명령을 입력합니다.
A$ ls ~
A$ ls /etc
B에서:
B$ git status
B$ git log
쉘을 입력할 때 history
해당 쉘의 모든 명령을 보고 싶습니다.함께,뒤쪽에다른 셸의 명령 - 이렇게 하면 항상 uparrow를 사용하여 현재 셸에서 마지막 명령을 가져올 수 있습니다. 즉, history
쉘 A에서는 다음과 같이 표시되어야 합니다.
git status
git log
ls ~
ls /etc
쉘 B에서는 다음과 같이 표시되어야 합니다.
ls ~
ls /etc
git status
git log
어떻게 해야 하나요?
답변1
내장된 솔루션은 없는 것 같지만, 수동으로 구현하는 것은 그리 어렵지 않은 것으로 나타났습니다. 각 세션의 기록을 별도로 저장하고 각 프롬프트에서 이를 다시 생성해야 합니다(말처럼 느리지는 않습니다). 핵심 논리는 다음과 같습니다.
# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
history -a ${HISTFILE}.$$
history -c
history -r
for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
history -r $f
done
history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'
# merge session history into main history file on bash exit
merge_session_history () {
cat ${HISTFILE}.$$ >> $HISTFILE
rm ${HISTFILE}.$$
}
trap merge_session_history EXIT
바라보다이 점일부 보호 조치 및 성능 최적화를 포함한 완벽한 솔루션입니다.
답변2
이것은 질문에 대한 정확한 대답은 아니지만 여전히 매우 유사하므로 일부 사람들은 흥미로울 수 있습니다.
내 직감은 uparrow가 지역 역사뿐만 아니라 Ctrl-r
공유된 글로벌 역사를 기반으로 행동해야 한다는 것입니다. 다음은 한 가지 방법입니다(fzf 사용).
# do not overwrite the history file on exit
shopt -s histappend
# immediately add the last command to the history file
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
# use a custom function that uses $HISTFILE for Ctrl-r
__my_history__() {
READLINE_LINE=$(fzf --query "$READLINE_LINE" < $HISTFILE)
READLINE_POINT=${#READLINE_LINE}
}
bind -x '"\C-r": __my_history__'