Eu tenho configuração .bash_profile para exportar para um arquivo de histórico:
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')
Então estou exportando carimbos de data/hora para o comando de histórico.
export HISTTIMEFORMAT="%Y/%m/%d %T "
Essa combinação fez com que os carimbos de data e hora da época fossem gravados no arquivo de histórico:
#1463962023
top
Então eu escrevi em um perl um liner no .bash_profile para escrever apenas o carimbo de data / hora legível por humanos no arquivo, eliminando assim a linha de época: (e algumas outras linhas)
format_history () {
local file=/root/history/.bash_hist-$(who -m | awk '{print $1}')
perl -i -pe 's/^#(\d{10})$/"# ".localtime($1)/e' "$file"
}
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
Agora meu arquivo exportado fica assim:
# Sun May 22 19:06:41 2016
last
O que é ótimo e exatamente o que eu quero. No entanto, isso tem o efeito colateral indesejado de anexar uma linha dedicada no comando histórico que contém apenas datas que não precisam estar lá.
824 2016/05/22 19:07:33 # Sun May 22 19:06:41 2016
825 2016/05/22 19:07:33 last
Como posso gravar no arquivo como desejo, sem fazer com que o comando de histórico relate essas linhas indesejadas?
NOTA - Esta anomalia com o comando histórico parece ser "ativada" quando eu faço login em um sistema. (Eu uso ssh) Posso estar em sessão, executar 10 comandos, depois executar o comando de histórico e tudo parece normal. No entanto, assim que você fizer logout e login novamente e executar o comando de histórico, as linhas erradas serão exibidas.
ATUALIZAÇÃO: reduzi o problema à linha:
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
Quando comento esta linha, o comando history funciona conforme o esperado. Porém, este também foi o comando que executou a formatação do arquivo histórico. Tentei retirar a parte "history -a" da linha, deixando o resto, mas isso não faz diferença. Se eu deixasse a linha inteira comentada, como poderia invocar a formatação do arquivo usando o script perl?
Responder1
Eu deixaria o arquivo de histórico em paz e implementaria sua gravação de comandos no manipulador prompt_command. Eu também faria com que ele fosse gravado em um arquivo de log privado, então você não teria conflitos com outros usos do arquivo de histórico ou problemas com outros usuários acessando/root