Preciso escrever um script que grave em um arquivo quantas vezes esse script foi executado.
Como eu posso fazer isso?
command-line
bash
scripts
Milen Grigorov
fonte
fonte
echo $(( $(cat countfile 2>/dev/null || echo 0) + 1 )) > countfile
$(…)
seja executado antes de qualquer outra coisa (especialmente antes do>
). Mas geralmente uso a$(cat countfile 2>/dev/null || echo 0)
peça para obter um padrão razoável, caso o arquivo não exista. Poderíamos adicionar umsponge
:-) para estar seguro.flock
comando para evitar condições de corrida. Veja unix.stackexchange.com/a/409276Apenas deixe o script criar um arquivo de log, adicione, por exemplo, uma linha no seu script no final:
Dessa forma, você pode formatar a forma como apresenta a data e a hora, mas se você deseja apenas uma data e hora completas (e
HH:MM:SS
é um formato aceitável para você), também pode usar:Então você poderia fazer:
Que conta os caracteres da nova linha e fornece uma estimativa de quantas linhas estão dentro do arquivo de log. Até isso, você pode ver dentro do arquivo de log, mesmo quando ele foi executado. Para adaptá-lo às suas necessidades, você pode alterar os caminhos e nomes usados para o log. Acabei de fazer um exemplo aqui que salva o arquivo de log
~
.Portanto, por exemplo, você deseja que o script adicione essa contagem à linha que você adicionou no final do script, você pode fazer algo assim no início do script:
E mude sua linha no final do script para algo que inclua até essas informações:
fonte
Essa solução usa a mesma abordagem da resposta do Byte Commander, mas não depende da aritmética do shell ou de outros bashismos.
Os redirecionamentos de fluxo
/dev/null
(para suprimir a mensagem de erro no redirecionamento subsequente da entrada doread
comando se o arquivo do contador estiver faltando, como esperado),fonte
Uma abordagem diferente
Um arquivo de contador separado tem desvantagens:
Portanto, essa resposta elimina um arquivo de contador separado e coloca a contagem no próprio script bash!
flock
garantias de que, por um breve momento, não é possível que dois usuários executem o script ao mesmo tempo.O código
Outra abordagem usando um arquivo de log
Semelhante à resposta da Videonauth, escrevi uma resposta para o arquivo de log aqui: Script Bash para manter a trilha de auditoria / log de arquivos acessados para log toda vez que os poderes de raiz eram usados com
gedit
ounautilus
.O problema, porém, é que, em vez de usar
gksu
o script, é nomeadogsu
e invocapkexec
a maneira "moderna" de usar o sudo na GUI, pelo que me disseram.Outra vantagem não é apenas a indicação de cada vez que os poderes raiz foram usados,
gedit
mas também registra o nome do arquivo que foi editado. Aqui está o código.~/bin/gsu
:/usr/local/bin/log-file
:Conteúdo do arquivo de log
gsu-log-file-for-gedit
após algumas edições:fonte