bash salvar histórico sem saída


16

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

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

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

lembrete: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/#more-130


ao acessar remotamente o terminal a partir da massa, existe a opção de escolher fechar a janela na saída: sempre. o que salva a história para mim.
ColacX

Respostas:


34

Histórico do Bash

Quaisquer novos comandos que foram emitidos no terminal ativo podem ser anexados ao .bash_historyarquivo com o seguinte comando:

history -a

O único conceito complicado de entender é que cada terminal tem sua própria lista de histórico de bash (carregado a partir do .bash_historyarquivo quando você abre o terminal)

Se desejar extrair qualquer novo histórico que tenha sido gravado por outros terminais durante a vida útil deste terminal ativo, você poderá anexar o conteúdo do .bash_history arquivo à lista de histórico do bash ativo

history -c;history -r

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

Solução

Você pode usar a variável bash PROMPT_COMMANDpara emitir um comando a cada novo prompt (toda vez que você pressionar enter no terminal)

export PROMPT_COMMAND='history -a'

Isso registrará cada comando no arquivo de histórico conforme ele é emitido.

Resultado

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

Mais precisão

Digamos (por algum motivo) que você tem dois terminais que está usando simultaneamente e deseja que o histórico reflita entre os dois 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 por que essa opção mais precisa provavelmente é um exagero, mas funciona para esse caso de uso.


isso é tão impressionante para fluxos de trabalho adequadas ....
Matt


1

Não é uma maneira de salvar toda a história sua festança para um arquivo separado , mas se você está tentando usar o mecanismo de história e por algum motivo ele não está salvando toda a sua história, que é 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
      *\033]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 "\033]0;$(history 1 | sed 's/^ *[0-9]* *//') :: ${PWD} :: ${USER}@${HOSTNAME}\007"
      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 dizer ao comando do histórico "Salvar agora!" ao clicar no X em uma janela de terminal virtual

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

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

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

  • SIGHUP: Esse sinal normalmente faz com que o Bash termine normalmente 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 no espaço do usuário ignorar esses sinais. O kernel pode forçosamente matar ou interromper o processo a qualquer momento usando esses sinais. Se o seu emulador de VT está enviando um desses, não podemos capturá-lo e fazer alguma coisa antes de sair, então você está sem sorte.

Algumas referências: pergunta ServerFault 337123

Pergunta Unix 6332

Usando o Histórico Interativamente no manual GNU Bash

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.