Eu criei uma solução que funciona sem disparar um processo extra em cada prompt. Assim como a resposta 0xAF , ele usa $PROMPT_COMMAND
. É um pouco confuso, mas parece funcionar.
Existem três etapas:
Primeiro, criei um script chamado update-dot-today
. Eu coloquei em $HOME/bin
.
Aqui está o script:
#!/bin/bash
dir=$HOME/.today
mkdir -p $dir
file_count=$(ls $dir | wc -l)
today=$(date +%F)
if [ $file_count -eq 1 ] ; then
if [ ! -e $dir/$today ] ; then
mv $dir/* $dir/$today
fi
else
mv $dir $dir-$$
mkdir -p $dir
touch $dir/$today
rm -rf $dir-$$
fi
Quando isso é executado, garante que o arquivo $HOME/.today/YYYY-MM-DD
exista e que nada mais exista em $HOME/.today
. Depois que o arquivo é criado, o script renomeia o arquivo existente conforme necessário, evitando quaisquer condições de corrida.
Em segundo lugar, adicionei duas entradas ao meu crontab:
@reboot $HOME/bin/update-dot-today
0 0 * * * $HOME/bin/update-dot-today
Isso garante que o arquivo seja criado na inicialização e atualizado todas as noites à meia-noite, horário local.
Em terceiro lugar, adicionei o seguinte ao meu $HOME/.bashrc
:
today=$(date +%F)
if [ -d $HOME/.today ] ; then
PROMPT_COMMAND='if [ ! -f "$HOME/.today/$today" ] ; then today=$(ls $HOME/.today) ; fi'
fi
Isso verifica o arquivo $HOME/.today/YYYY-MM-DD
apropriado - mas se ele já existir e seu nome corresponder ao valor atual de $today
, o único custo será uma verificação de existência de arquivo.
Se preferir, o arquivo YYYY-MM-DD
pode ser colocado em algum lugar diferente de /tmp/today
, talvez sob seu diretório pessoal. (Na verdade, isso pode ser mais seguro, no caso de algo limpar /tmp
entre as reinicializações, ou no caso de outro usuário no sistema usar a mesma abordagem).
O único inconveniente (além do fato de ser bastante complicado) é que o valor de $today
é definido somente depois que um prompt de shell é impresso. Mas isso é apenas uma questão de lembrar de digitar um extra Enter pelo menos uma vez depois da meia-noite.