Primeiro de tudo, isso não é uma duplicata de nenhum encadeamento existente no SE. Eu li esses dois tópicos ( 1º , 2º ) sobre uma melhor história do bash, mas nenhuma das respostas funciona - - eu estou no Fedora 15 a propósito.
.bashrc
Adicionei o seguinte ao arquivo no diretório do usuário (/ home / aahan /), e ele não funciona. Alguém tem uma pista?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
Ok, é isso que eu quero com o histórico do bash (prioridade):
- não armazene duplicados, apague os existentes
- compartilhe imediatamente o histórico com todos os terminais abertos
- sempre acrescente o histórico, não o substitua
- armazenar comandos de várias linhas como um único comando (que está desativado por padrão)
- qual é o tamanho padrão do histórico e o tamanho do arquivo de histórico?
bash
command-history
wsou eu
fonte
fonte
echo $SHELL
) As configurações funcionam se você as executar manualmente a partir do seu shell aberto? Obviamente, como eles funcionam para muitos outros, as configurações estão corretas, você as implementou de maneira errada. E nenhuma máquina virtual Fedora15 / Gnome3 / / tem pouco a ver com a função real debash
..bashrc
arquivo. Isso está errado? Você pode adicionar uma "resposta" a esta postagem com os comandos reais do shell? (por favor, tenha com meu Noob-dade.).bashrc
são comandos de shell reais. Scripts são apenas séries de comandos do shell. Além disso, a edição que você fez recentemente da remoção doexport
bit foi uma má ideia, que deve ser mantida.Respostas:
Este é realmente um comportamento realmente interessante e confesso que subestimei bastante a pergunta no início. Mas primeiro os fatos:
1. O que funciona
A funcionalidade pode ser alcançada de várias maneiras, embora cada uma funcione de maneira um pouco diferente. Observe que, em cada caso, para que o histórico seja "transferido" para outro terminal (atualizado), é necessário pressionar Entero terminal, onde ele deseja recuperar o histórico.
Opção 1:
Isso tem duas desvantagens:
opção 2:
(Sim, não é necessário
shopt -s histappend
e sim, ele deve estarhistory -c
no meio dePROMPT_COMMAND
) Esta versão também tem duas desvantagens importantes:history
comando pode dar uma saída falsa - veja abaixo.[Edit] "E o vencedor é ..."
opção 3:
Isto é o mais longe possível. É a única opção para que ambos
erasedups
e a história comum funcionem simultaneamente. Esta é provavelmente a solução final para todos os seus problemas, Aahan.2. Por que a opção 2 parece não funcionar (ou: o que realmente não funciona como o esperado)?
Como mencionei, cada uma das soluções acima funciona de maneira diferente. Mas a interpretação mais enganosa de como as configurações funcionam vem da análise da saída do
history
comando . Em muitos casos, o comando pode fornecer uma saída falsa . Por quê? Porque é executado antes da sequência de outroshistory
comandos contidos noPROMPT_COMMAND
! No entanto, ao usar a segunda ou terceira opção, é possível monitorar as alterações de.bash_history
conteúdo (usando,watch -n1 "tail -n20 .bash_history"
por exemplo) e ver qual é o histórico real.3. Por que a opção 3 é tão complicada?
Tudo está no modo como
erasedups
funciona. Como o manual do bash afirma, "(...)erasedups
faz com que todas as linhas anteriores correspondentes à linha atual sejam removidas da lista de histórico antes que a linha seja salva" . Então, isso é realmente o que o OP queria (e não apenas, como eu pensava anteriormente, não ter duplicatas aparecendo em sequência ) . Eis por que cada um doshistory -.
comandos tem ou não pode estar noPROMPT_COMMAND
:history -n
precisa estar lá anteshistory -w
para ler.bash_history
os comandos salvos de qualquer outro terminal,history -w
precisa estar lá para salvar o histórico em arquivos e apagar duplicatas,history -a
não deve ser colocado lá em vez dehistory -w
, porque não aciona a exclusão de duplicatas,history -c
também é necessário porque evita que o buffer do histórico seja destruído após cada comando,e, finalmente,
history -r
é necessário restaurar o buffer do histórico a partir do arquivo, tornando o histórico compartilhado entre as sessões do terminal.fonte
watch "tail -n 20 .bash_history"
vez dotail -f .bash_history
.history -c
também é necessário porque evita o descarte do buffer do histórico após cada comando Por que esse lixo ocorre?No seu prompt de comando, você está usando o
-c
comutador. Deman bash
:Para compartilhar seu histórico com todos os terminais abertos, você pode usar
-n
:O tamanho padrão também está no manual:
Para salvar comandos de várias linhas:
Além disso, você não deve preceder os comandos HIST * com
export
- eles são variáveis apenas do bash, não variáveis ambientais:HISTCONTROL=ignoredups:erasedups
é suficiente.fonte
export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"
está correto? Além disso, você sabe como posso fazer com que o arquivo de histórico armazene comandos de várias linhas como um único comando (que está desativado por padrão)?shopt -s cmdhist
ele salvará várias linhas.HISTCONTROL=ignoredups:erasedups
não está funcionando. Eu também tentei ter exatamente isso no.bashrc
arquivo (entre funções personalizadas). Alguma ideia do que pode estar errado? Estou usando o Fedora 15 em uma máquina virtual - - Windows 7 host./etc/bashrc
,.bash_profile
que o esteja substituindo..bash_profile
arquivo. Quanto ao conteúdo em/etc/bashrc
que eu colocá-lo aqui, por favor, dê uma olhada - pastebin.com/Uae6sE6sFoi isso que eu criei e estou feliz com isso até agora ...
NOTAS:
HISTIGNORE
ignora todos os comandos que não têm argumentos. Isso pode não ser desejável para algumas pessoas e pode ser deixado de fora.fonte
Use isto:
fonte
Não funciona, porque você esquece:
Mas parece que
history -n
é apenas buggy quandoexport HISTCONTROL=ignoreboth:erasedups
está em vigor.Permite experimentar:
Aqui, ativamos a exclusão de dups, alternamos o histórico para um arquivo personalizado, limpamos o histórico. Após a conclusão de todos os comandos, temos o arquivo de histórico vazio e um comando no histórico atual.
Abra o segundo terminal e execute esses seis comandos também. Depois disso:
Agora seu histórico atual possui dois comandos e o arquivo de histórico possui:
Voltar ao primeiro terminal:
Huh ... nenhum dos
echo
comandos é lido. Mude para o segundo terminal novamente e:Agora o arquivo de histórico é:
Mude para o primeiro terminal novamente:
Você pode ver que o
echo "Z"
comando está mescladohistory -n
.Outro bug é por causa dos comandos que são lidos na história pelo número do comando e não pelo tempo do comando, eu acho. Espero que outros
echo
comandos apareçam na históriafonte
O erasedups não corta (como o chomp em alguns idiomas) os espaços iniciais e finais. Isso é um bug. Também as apagadas não excluem todas as entradas anteriores.
fonte