bash equivalente a este uso do comando tcsh "sched"?

bash equivalente a este uso do comando tcsh "sched"?

No tcsh, o comando integrado schedfaz com que um comando seja executado pelo shell atual em um horário especificado.

Eu tenho o seguinte $HOME/.schedarquivo (esta é uma versão simplificada dele):

setenv today `date +%F`
sched +00:01 sched 00:00 source $HOME/.sched

Eu então source $HOME/.schedno meu $HOME/.cshrc.

Isso define a variável de ambiente $todaycomo, 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 datecomando é invocado apenas uma vez por dia e somente quando necessário.

Existe uma maneira de fazer isso no bash? Observe que o atcomando 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 atchamando um script de shell que faz o que precisa e depois configura um novo attrabalho. 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.

informação relacionada