Compartilhar o histórico do shell nas sessões sem intercalá-lo

0

Existe uma pergunta semelhante aqui , mas Eu quero conseguir algo diferente: gostaria de compartilhar o histórico entre as sessões, mas sem misturar os comandos que foram executados em sessões diferentes juntos.

Por exemplo, digamos que eu tenha duas sessões de shell: A e B. Eu digite alguns comandos em A:

A$ ls ~
A$ ls /etc

E em B:

B$ git status
B$ git log

Quando digito history em um shell, eu gostaria de ver todos os comandos deste shell juntos , após comandos de outros shells - para que eu possa use sempre uprrow para obter os últimos comandos do shell atual. Em outras palavras, history no shell A deve mostrar

git status
git log
ls ~
ls /etc

E no shell B, ele deve ser exibido

ls ~
ls /etc
git status
git log

Como fazer isso?

    
por Jan Warchoł 04.02.2018 / 20:24

1 resposta

3

Parece que não há solução integrada para isso, mas a implementação manual não é tão difícil. É preciso armazenar o histórico de cada sessão separadamente e recriá-lo em cada prompt (não é tão lento quanto parece). Aqui está a lógica central:

# 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

Consulte esta questão para obter uma solução completa, incluindo algumas salvaguardas e otimizações de desempenho.

    
por 14.03.2018 / 10:00