Cria o log de histórico por diretório de trabalho no bash

2

Eu queria saber se é possível manter um arquivo contendo histórico por diretório de trabalho atual. Então, por exemplo, se eu estivesse trabalhando em /user/temp/1/ e digitasse alguns comandos, esses comandos seriam salvos em /user/temp/1/.his ou algo assim. Eu estou usando bash.

    
por tafelplankje 24.08.2016 / 20:37

3 respostas

4

Criando a resposta fornecida por Groggle , você pode criar um cd (ch) alternativo em seu ~ / .bash_profile como.

function ch () {
    cd "$@"
    export HISTFILE="$(pwd)/.bash_history"
}

exportando automaticamente o novo valor HISTFILE cada vez que ch é chamado.

O comportamento padrão no bash apenas atualiza seu histórico quando você finaliza uma sessão de terminal, então, por si só, ele simplesmente salvará o histórico em um arquivo .bash_history na pasta da qual você acabou de terminar sua sessão. Uma solução é mencionada em este post e detalhado em esta página , permitindo que você atualize seu HISTFILE em tempo real.

Uma solução completa consiste em adicionar mais duas linhas ao seu ~ / .bash_profile,

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

alterando o modo de histórico para anexar com a primeira linha e configurando o comando history para ser executado em cada prompt.

    
por 24.08.2016 / 22:59
2

Você pode configurar o código a ser executado ao alterar os diretórios. Em zsh, isso é tão simples quanto definir uma função e adicioná-la ao array chpwd_functions . No bash, isso exige um pouco mais de trabalho, mas você também pode fazê-lo; consulte Execute scripts bash ao inserir um diretório para saber como definir uma função chpwd que é executada em cada alteração de diretório.

Para o que você deseja fazer, a função chpwd precisa escrever o histórico atual para o arquivo antigo. Para salvar o histórico no local certo ao sair do bash, defina o HISTFILE variável para o arquivo de histórico do novo diretório e leia o novo histórico.

chpwd () {
  history -a
  mkdir -p "$HOME/.bash_history.d/${PWD%/*}"
  HISTFILE=~/.bash_history.d/$PWD
  history -r
}

Observe que escrevo o histórico em uma hierarquia em seu diretório inicial, não no diretório atual. Escrever o histórico do shell no diretório atual seria extremamente perigoso e prejudicial : você acabaria com vazamentos de privacidade em todo o lugar, arriscaria modificar arquivos indesejados (e se o nome do arquivo de histórico for um link simbólico existente para algum outro lugar?), etc.

Provavelmente seria melhor escrever a história depois de cada comando. No bash, você pode ativar isso com a opção histappend . Com essa opção, você não precisa executar history -a explicitamente.

shopt -s histappend
chpwd () {
  mkdir -p "$HOME/.bash_history.d/${PWD%/*}"
  HISTFILE=~/.bash_history.d/$PWD
  history -r
}
    
por 25.08.2016 / 01:13
0

Dependendo da frequência com que você altera os diretórios, minha solução pode não funcionar. Você pode exportar o HISTFILE que define onde o histórico do bash é armazenado, então a idéia é que você pode criar perfis separados nos diretórios nos quais você está trabalhando e depois carregá-los automaticamente usando algo como direnv.

HISTFILE="$(pwd).bash_history"

Direnv link

Espero que ajude.

    
por 24.08.2016 / 20:53