bash salvar histórico sem sair

14

no terminal bash do ubuntu bash. Existe alguma maneira de salvar o histórico bash sem escrever saída? eu defini a configuração para "HISTCONTROL = apagados"

que, na minha opinião, funciona melhor do que os ignorados.

de qualquer maneira, por algum motivo, ele não salvará os últimos comandos no terminal bash, a menos que eu digite "exit". Eu estou acostumado a apenas clicar na cruz na janela do terminal, por isso estou sempre irritado que os últimos comandos não foram salvos quando eu relogar.

lembrete: link

    
por ColacX 21.02.2013 / 15:47

3 respostas

31

Histórico de Bash

Qualquer novo comando que tenha sido emitido no terminal ativo pode ser anexado ao arquivo .bash_history com o seguinte comando:

history -a

O único conceito difícil de entender é que cada terminal tem seu próprio histórico bash list (carregado do arquivo .bash_history quando você abre o terminal)

Se você quiser extrair qualquer novo histórico que tenha sido gravado por outros terminais durante a vida útil desse terminal ativo, é possível anexar o conteúdo do arquivo .bash_history ao histórico bash ativo lista

history -c;history -r

Isso limpará a lista do histórico atual para que não tenhamos uma lista repetida e anexará o arquivo do histórico à lista (agora vazia).

Solução

Você pode usar a variável bash PROMPT_COMMAND para emitir um comando a cada novo prompt (sempre que você pressionar Enter no terminal)

export PROMPT_COMMAND='history -a'

Isso registrará cada comando no histórico arquivo quando ele for emitido.

Resultado

Agora, qualquer novo terminal que você abrir terá o histórico de outros terminais sem ter que exit desses outros terminais. Este é o meu fluxo de trabalho preferido.

Mais precisão

Digamos que (por algum motivo) você tenha dois terminais que esteja usando simultaneamente e queira que o histórico reflita entre ambos para cada novo comando.

export PROMPT_COMMAND='history -a;history -c;history -r'

A principal desvantagem aqui é que você pode precisar pressionar enter para executar novamente o PROMPT_COMMAND para obter o histórico mais recente do terminal oposto.

Você pode ver porque essa opção mais precisa é provavelmente um exagero, mas funciona para esse caso de uso.

    
por 01.06.2013 / 02:41
2

Para salvar o histórico do bash no arquivo:

history -w ~/history.txt
vim ~/history.txt

Exporta o histórico para um arquivo chamado history.txt. Você pode visualizá-lo usando seu editor favorito.

Resposta copiada de link

    
por 11.06.2014 / 03:13
1

Existe uma maneira de salvar todo seu histórico bash em um arquivo separado , mas se você estiver tentando usar o mecanismo do histórico e por algum motivo ele não estiver salvando toda a sua história, essa é uma questão diferente.

Para salvar todo o seu histórico em um arquivo separado, sempre, não importa o que aconteça com o terminal

Um script fornecido aqui faz o truque.

# don't put duplicate lines in the history. See bash(1) for more options
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth

# set the time format for the history file.
export HISTTIMEFORMAT="%Y.%m.%d %H:%M:%S "

# If this is an xterm set the title to user@host:dir
case "$TERM" in
  xterm*|rxvt*)
  # Show the currently running command in the terminal title:
  # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
  show_command_in_title_bar()
  {
    case "$BASH_COMMAND" in
      *3]0*)
      # The command is trying to set the title bar as well;
      # this is most likely the execution of $PROMPT_COMMAND.
      # In any case nested escapes confuse the terminal, so don't
      # output them.
      ;;
      *)
      if test ! "$BASH_COMMAND" = "log_bash_eternal_history"
      then
        echo -ne "3]0;$(history 1 | sed 's/^ *[0-9]* *//') :: ${PWD} :: ${USER}@${HOSTNAME}
# don't put duplicate lines in the history. See bash(1) for more options
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth

# set the time format for the history file.
export HISTTIMEFORMAT="%Y.%m.%d %H:%M:%S "

# If this is an xterm set the title to user@host:dir
case "$TERM" in
  xterm*|rxvt*)
  # Show the currently running command in the terminal title:
  # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
  show_command_in_title_bar()
  {
    case "$BASH_COMMAND" in
      *3]0*)
      # The command is trying to set the title bar as well;
      # this is most likely the execution of $PROMPT_COMMAND.
      # In any case nested escapes confuse the terminal, so don't
      # output them.
      ;;
      *)
      if test ! "$BASH_COMMAND" = "log_bash_eternal_history"
      then
        echo -ne "3]0;$(history 1 | sed 's/^ *[0-9]* *//') :: ${PWD} :: ${USER}@${HOSTNAME}%pre%7"
      fi
      ;;
    esac
  }
  trap show_command_in_title_bar DEBUG
  ;;
  *)
  ;;
esac

log_bash_eternal_history()
{
  local rc=$?
  [[ $(history 1) =~ ^\ *[0-9]+\ +([^\ ]+\ [^\ ]+)\ +(.*)$ ]]
  local date_part="${BASH_REMATCH[1]}"
  local command_part="${BASH_REMATCH[2]}"
  if [ "$command_part" != "$ETERNAL_HISTORY_LAST" -a "$command_part" != "ls" -a "$command_part" != "ll" ]
  then
    echo $date_part $HOSTNAME $rc "$command_part" >> ~/.bash_eternal_history
    export ETERNAL_HISTORY_LAST="$command_part"
  fi
}

PROMPT_COMMAND="log_bash_eternal_history"
7" fi ;; esac } trap show_command_in_title_bar DEBUG ;; *) ;; esac log_bash_eternal_history() { local rc=$? [[ $(history 1) =~ ^\ *[0-9]+\ +([^\ ]+\ [^\ ]+)\ +(.*)$ ]] local date_part="${BASH_REMATCH[1]}" local command_part="${BASH_REMATCH[2]}" if [ "$command_part" != "$ETERNAL_HISTORY_LAST" -a "$command_part" != "ls" -a "$command_part" != "ll" ] then echo $date_part $HOSTNAME $rc "$command_part" >> ~/.bash_eternal_history export ETERNAL_HISTORY_LAST="$command_part" fi } PROMPT_COMMAND="log_bash_eternal_history"

Para informar o comando do histórico "Salvar agora!" ao clicar no X em uma janela de terminal virtual

Primeiro, o que você precisa entender é: qual mecanismo o seu emulador de terminal virtual usa para matar o processo bash quando ele sai? - Isso dependerá do emulador de terminal exato que você está usando .

Existem algumas opções, e todas elas envolvem sinais do UNIX .

  • SIGTERM, SIGINT, SIGQUIT: O comportamento padrão quando o Bash recebe um desses sinais no modo interativo é ignorá-lo, então é provavelmente que não.

  • SIGHUP: Este sinal normalmente faz com que o Bash termine de forma elegante e faça a limpeza, mas não tenho certeza se essa "limpeza" envolve salvar o arquivo de histórico. Provavelmente não.

  • SIGKILL, SIGSTOP: É impossível para o Bash como um processo de espaço do usuário ignorar esses sinais. O kernel pode matar ou interromper o processo a qualquer momento usando esses sinais. Se o seu emulador de VT estiver enviando um desses, não podemos capturá-lo e fazer algo antes de sair, então você está sem sorte.

Algumas referências: ServidorPerguntas sobre falhas 337123

Questão Unix 6332

Usando a História Interativamente no manual GNU Bash

    
por 21.02.2013 / 16:16