Para evitar o registro de comandos "perigosos" no histórico do bash, adicionei a seguinte linha ao meu .bashrc
arquivo:
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
isso funciona bem, mas tem um efeito colateral: não consigo ver o histórico completo dos comandos executados em uma máquina. Digamos que tenho várias máquinas para experimentos e quero poder ver todos os comandos executados. Eu usaria o bash internal history
para exibir comandos executados e talvez grep para a data de hoje:
history | grep Sep-28
O que eu gostaria de ter é registrar também comandos "perigosos", mas coloque um #
no início da linha, para que, se eu executar o comando do histórico por engano, nenhum dano será causado.
Não tenho ideia se isso é possível.
Atualização e esclarecimento:
A principal razão pela qual isso é um problema para mim é que geralmente estou conectado à minha máquina a partir de vários terminais, e qualquer comando executado em um terminal é imediatamente lido no histórico de outros terminais. Isso é alcançado por
PROMPT_COMMAND="history -a; history -c; history -r"
Vamos imaginar que tenho dois terminais abertos. Em um, tenho algum cat /dev/foo > file.out
processo em execução. No segundo, verifico o progresso com ls -lAhF
. Continuo repetindo ls
pressionando Upe ENTER(ou seja, o último comando da história). Assim que o primeiro comando termina, o último comando do histórico não é mais ls
, mascat /dev/foo > file.out
. Se não tomar cuidado, vou iniciar o gato novamente e sobrescrever file.out.
O que eu gostaria de conseguir é que o comando cat seja precedido por a #
, para que não seja executado. No entanto, eu ainda o veria na história e posso reutilizá-lo (se for um comando longo) sem comentar.
fonte
watch ls -lAhF
orwhile sleep 1; do ls -lAhf; done
; em vez de observar o tamanho do arquivo, você pode usarpv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ).Respostas:
Você poderia fazer algo como:
A idéia é que antes de cada prompt, vamos verificar a última entrada do histórico (
history 1
) e se é uma das perigosas queridos, nós excluí-lo (history -d
) e adicioná-lo de volta com um#
comhistory -s
.(obviamente, você precisa remover sua
HISTIGNORE
configuração).Um efeito colateral indesejado de que, porém, é que ele altera o tempo a história daqueles
rm
,mv
... comandos.Para consertar isso, uma alternativa poderia ser:
Desta vez, registramos a hora do último histórico e, para adicionar novamente a linha do histórico, usamos
history -r
um arquivo temporário (o documento aqui) que inclui o registro de data e hora.Você quer que o
fixhist
seja realizado antes do seuhistory -a; history -c; history -r
. Infelizmente, a versão atual debash
um bughistory -a
não salva a linha extra que adicionamos. Uma solução é escrevê-lo:Isso é anexar o comando comentado ao HISTFILE em vez de deixá-
history -a
lo.fonte
cmd=${cmd#*[0-9] }
faz? E onde exatamente eu devo colocarfixhist
na minhaPROMPT_COMMAND
? No momento, ele já contémPROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? Eu já definiexport HISTTIMEFORMAT="%b-%d %H:%M "
. A propósito, quando adiciono seu código ao meu$HOME/.bashrc
, nada acontece.HISTTIMEFORMAT=/
é apenas para essa chamada dehistory
obter uma saída como123 /rm x
onde é mais fácil extrair o cmd. Houve um problema com algumas versões debash
onde$HISTCMD
era falso nesse contexto, tente a nova versão.#
no código não agir como comentários em.bashrc
?bash
insere um*
após o número história que não era esperado. Deve ser corrigido agora.Não vou responder exatamente à sua pergunta, mas talvez lhe dê uma solução alternativa para o seu problema.
Se bem entendi, você está preocupado com os erros que pode cometer digitando, por exemplo,
!rm
se orm
comando anterior no histórico remover algo que você gostaria de manter.Nesse caso, é uma boa opção do bash
histverify
. Se vocêshopt -s histverify
, e se você chamar um comando com o estrondo!
, ele não será executado imediatamente, mas será carregado na linha de leitura para que você possa decidir executá-lo ou não, e isso também lhe dará a possibilidade de editá-lo.Tente:
Sem
histverify
:Com
histverify
:Nesse caso, você terá o cursor no final da linha, pronto para iniciá-lo novamente - ou não - ou para editá-lo.
Se você gosta dessa opção, coloque-a no seu
.bashrc
:fonte