No tcsh, o comando integrado sched
faz com que um comando seja executado pelo shell atual em um horário especificado.
Eu tenho o seguinte $HOME/.sched
arquivo (esta é uma versão simplificada dele):
setenv today `date +%F`
sched +00:01 sched 00:00 source $HOME/.sched
Eu então source $HOME/.sched
no meu $HOME/.cshrc
.
Isso define a variável de ambiente $today
como, por exemplo, "2012-06-25"
e a atualiza automaticamente para a data atual todas as noites à meia-noite. O trabalho é reprogramado automaticamente sempre que é executado.
Observe que o date
comando é invocado apenas uma vez por dia e somente quando necessário.
Existe uma maneira de fazer isso no bash? Observe que o at
comando não funcionará; ele invoca um comando externamente e não pode afetar o ambiente do shell atual.
(Eu sei que posso digitar $(date +%F)
em vez de $today
, mas como uso isso de forma interativa, a digitação extra é um fardo significativo.)
tcsh também possui vários aliases especiais que são executados automaticamente em determinadas circunstâncias:
Obipcmd,cwdcmd,periódico,précmd,postcmd, etrabalhocmd Aliases especiaispode ser configurado, respectivamente, para executar comandos quando o shell quiser tocar a campainha, quando o diretório de trabalho mudar, a cada períodominutos, antes de cada prompt, antes de cada comando ser executado, depois de cada comando ser executado e quando um trabalho é iniciado ou colocado em primeiro plano.
O bash tem algo parecido com isso?
Responder1
Você tentou $PROMPT_COMMAND
? É comumente usado para definir o título do xterm para mostrar CWD, por exemplo. Ele é executado quando o prompt é mostrado. Pode ser possível definir sua variável com isso. A primeira desvantagem seria que seu comando será executado toda vez que você pressionar Enter no shell. A segunda seria que se você não ficar ativo no seu terminal por muito tempo e o dia passar, ele não será configurado automaticamente. Ele será definido após a próxima entrada no terminal.
# export PROMPT_COMMAND="export today=\`date\`"
# echo $today
Tue Jun 26 01:07:19 EEST 2012
# echo $today
Tue Jun 26 01:07:21 EEST 2012
# echo $today
Tue Jun 26 01:07:22 EEST 2012
Responder2
Se você estiver disposto a trocar duas cotações anteriores por um dólar:
alias today='date +%F'
echo `today`
Se você quiser a data em uma variável, entãoatualizando-o emPROMPT_COMMAND
é a única maneira que consigo pensar. Você pode evitar a bifurcação de um processo a cada prompt usando a variável integrada SECONDS
.
update_today () {
if ((SECONDS/86400 > __last_today_update)); then
((__last_today_update = SECONDS/86400))
today=$(date +%F)
fi
}
PROMPT_COMMAND="update_today; $PROMPT_COMMAND"
Outra abordagem é inserir seu texto por meio de uma ligação de teclas.
rl_insert () {
READLINE_LINE=${READLINE_LINE:0:$READLINE_POINT}$1${READLINE_LINE:$READLINE_POINT}
((READLINE_POINT+=${#1}))
}
bind -x '"\C-xt":rl_insert "$(date +%F)"'
Responder3
Parece-me que você está procurando at
:
~$ agora + 1 minuto aviso: os comandos serão executados usando /bin/sh em> echo "teste" | parede em> trabalho 2 em segunda-feira, 25 de junho 17:51:00 2012 Mensagem de transmissão de usuário@host (em algum lugar) às 17:51 ... teste
Porém, acabei de reler sua pergunta e você está procurando por algo que se autoagende novamente. Isso seria muito fácil de fazer at
chamando um script de shell que faz o que precisa e depois configura um novo at
trabalho. No entanto, at
é executado em seu próprio subshell; não como o shell do qual você o invoca.
Responder4
Isso pode lhe dar uma ideia para uma solução:
$ trap 'today=$(date)' 10
$ echo $today
$ sleep 8
$ kill -10 $$
$ echo $today
Agora você pode usar at para enviar um sinal para si mesmo ($$) na virada do dia.