Use o arquivo de histórico bash da máquina antiga ao configurar a nova máquina?

6

Eu amo minha história bash. Às vezes eu emiti comandos muito longos e realmente dependo do meu histórico para recuperá-los rapidamente. Eu aumentei o tamanho do meu histórico com:

HISTSIZE=100000
HISTFILESIZE=200000

no meu .bashrc

Eu também tenho aliases:

alias h='history | tail'
alias hg='history | grep'

que me permitem fazer h e hg some_text , o que é realmente útil

Minha pergunta é: Posso mover esse arquivo de histórico para uma nova máquina? Por exemplo, minha máquina quebrou recentemente e eu tive que reconstruí-la. Eu teria problemas ao soltar um arquivo .history diferente, possivelmente substituindo o arquivo já existente. Preciso me certificar de substituí-lo ou posso acrescentar dois arquivos históricos sem problemas?

    
por Michael Durrant 16.06.2013 / 16:53

3 respostas

6

Sim. Você pode copiar o arquivo de histórico antigo para uma nova instalação. Você também pode mesclá-lo com o antigo / novo.

  • Se você não tiver o HISTTIMEFORMAT configurado, o arquivo de histórico conterá apenas comandos.
  • Se estiver definido, haverá um timestamp precedido por um hash para cada comando:

    #1122334455
    command1
    #1122334459
    command2
    

No entanto, observe se você emitir, por exemplo:

$ echo 'foo
> bar
> baz' >> some_file

Ele será salvo como:

#1122334459
echo 'foo
bar
baz' >> some_file

Mas history vai mostrar:

4 CMD_TIME echo 'foo
5 CUR_TIME bar
6 CUR_TIME baz' >> some_file

Comandos como:

$ foo | \
bar | \
baz

são preservados como um se você definir shopt -s cmdhist .

Eu uso vários, mas muitas vezes algo como:

HISTSIZE=500000
HISTFILESIZE=500000
# Ignore dupes and space commands
HISTCONTROL=ignoreboth
# Save and show timestamps
HISTTIMEFORMAT='%F %T '
# append to the history file, don't overwrite it
shopt -s histappend
# Save and reload the history after each command finishes
# This one I have a function to turn on/off. Effect is that commands are
# accessible in all terminals after execution.
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Também faço backup de arquivos de histórico regularmente e tenho alguns scripts e aliases para pesquisar o histórico - até mesmo muitos anos atrás no tempo. Às vezes lembro que fiz algo parecido com o que estou fazendo há 1.5 anos e posso procurar rapidamente na história.

Quanto aos timestamps, uso duas variantes. history mostra com carimbos de data / hora e outro show sem definir temporariamente HISTTIMEFORMAT to "".

Se a data e hora estiverem faltando, a hora atual (aproximadamente) será usada. Se os timestamps estiverem presentes, o histórico será classificado por vezes.

Assim:

.bash_history (registros de data e hora simplificados)

#timestamp 000012
some command
#timestamp 000002
some other command

$ history
1 13 aug 2013 10:44 some other command
2 13 aug 2013 12:13 some command

No entanto, é razoável acreditar que um arquivo de histórico ordenado é mais eficaz (o bash não precisa fazer nenhum embaralhamento).

Como para lookup Ctrl-R é frequentemente útil. Para outras coisas, veja por ex. Comandos para manipular a história , Event Designators , Alguns Comandos Diversos etc.

    
por 17.06.2013 / 00:20
3

Eu acho que você pode mover o arquivo sem problemas, ou anexar também.

para acrescentar:

cd ~
mv .bash_history .bash_history_new
cp /mnt/oldfs/home/olduser/.bash_history ~/
cat .bash_history_new >> .bash_history

Se você tiver algum problema, poderá desfazer isso:

mv .bash_history_new .bash_history
    
por 16.06.2013 / 17:37
3

Meu .bash_history geralmente é apenas um link simbólico para /dev/null (ou seja, meu histórico nunca é salvo em disco). Conseqüentemente, quando eu inicio um shell, não há histórico para acessar. No entanto, , um histórico se acumula, o que significa que o bash faz isso na memória, não no arquivo de histórico. De fato, man bash diz (em HISTORY ):

On startup, the history is initialized from the file named by the variable HISTFILE (default ~/.bash_history). [...] When the history file is read, lines beginning with the history comment character followed immediately by a digit are interpreted as timestamps for the preceding history line. These timestamps are optionally dis‐ played depending on the value of the HISTTIMEFORMAT variable. When an interactive shell exits, the last $HISTSIZE lines are copied from the history list to $HISTFILE.

Eu deixei o bit sobre os timestamps porque isso ajuda a explicar o formato do arquivo de histórico, se você olhar para ele (é uma lista de texto simples). O ponto principal aqui é que o arquivo de histórico é usado apenas quando o shell é iniciado pela primeira vez e, novamente, quando sai (para anexar o histórico recente).

Como o formato é simplesmente uma lista de comandos intercalados com timestamps, e o bash funcionará bem, mesmo que o arquivo não contenha nada (como o link / dev / null), então não posso imaginar que haja consequências negativas de importar um. Você provavelmente poderia até adicionar manualmente coisas nele, omitindo os timestamps - pelo menos, você poderia tentar. Se o shell apertar, basta sair e restaurar o histórico antigo.

Você também deve ser capaz de usar vários históricos para várias finalidades, se desejar, trocando arquivos ou exportando $HISTFILE antes de iniciar o shell. Se você os definir como somente leitura (ou talvez redefinir $HISTFILE subseqüentemente? Isso depende de o shell verificar essa variável no final ou usar o valor inicial), então eles não serão anexados quando o shell sair.

    
por 16.06.2013 / 18:35