¿Equivalente bash de este uso del comando tcsh "sched"?

¿Equivalente bash de este uso del comando tcsh "sched"?

En tcsh, el comando incorporado schedhace que el shell actual ejecute un comando en un momento específico.

Tengo el siguiente $HOME/.schedarchivo (esta es una versión simplificada):

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

Yo entonces source $HOME/.scheden mi $HOME/.cshrc.

Esto establece la variable de entorno $todayen, por ejemplo, "2012-06-25"y la actualiza automáticamente a la fecha actual todas las noches a medianoche. El trabajo se reprograma automáticamente cada vez que se ejecuta.

Tenga en cuenta que el datecomando se invoca sólo una vez al día y sólo cuando es necesario.

¿Hay alguna manera de hacer esto en bash? Tenga en cuenta que el atcomando no funcionará; invoca un comando externamente y no puede afectar el entorno del shell actual.

(Sé que puedo escribir $(date +%F)en lugar de $today, pero como lo uso de forma interactiva, escribir más es una carga importante).

tcsh también tiene varios alias especiales que se ejecutan automáticamente en determinadas circunstancias:

Elpitidocmd,cwdcmd,periódico,precmd,postcmd, ytrabajocmd Alias ​​especialesse pueden configurar, respectivamente, para ejecutar comandos cuando el shell quiere hacer sonar la campana, cuando cambia el directorio de trabajo, cada tperíodominutos, antes de cada mensaje, antes de ejecutar cada comando, después de ejecutar cada comando y cuando se inicia un trabajo o se pone en primer plano.

¿Bash tiene algo como esto?

Respuesta1

Has probado $PROMPT_COMMAND? Se usa comúnmente para configurar el título de xterm para que muestre CWD, por ejemplo. Se ejecuta cuando se muestra el mensaje. Es posible que pueda configurar su variable con esto. La primera desventaja sería que su comando se ejecutará cada vez que presione enter en el shell. La segunda sería que si no estás activo en tu terminal durante mucho tiempo y pasa el día, no se configurará automáticamente. Se configurará después de la siguiente entrada en la 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

Respuesta2

Si está dispuesto a cambiar dos cotizaciones atrasadas por un dólar:

alias today='date +%F'
echo `today`

Si quieres la fecha en una variable, entoncesactualizándolo enPROMPT_COMMANDes la única manera que se me ocurre. Puede evitar bifurcar un proceso en cada mensaje utilizando la variable incorporada 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"

Otro enfoque es insertar el texto mediante una combinación 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)"'

Respuesta3

Me parece que estás buscando at:

~$ en este momento + 1 minuto
Advertencia: los comandos se ejecutarán usando /bin/sh
en> eco "prueba" | muro
en>
trabajo 2 el lunes 25 de junio 17:51:00 2012

Mensaje de difusión del usuario@host                                              
        (en algún lugar) a las 17:51 ...                                               

prueba                                                                           

Sin embargo, acabo de releer tu pregunta y estás buscando algo que se reprograme solo. Eso sería bastante fácil de hacer atllamando a un script de shell que haga lo que necesita hacer y luego configure un nuevo attrabajo. Sin embargo, atse ejecuta en su propia subcapa; no como el shell desde el que lo invocas.

Respuesta4

Esto podría darle una idea para una solución:

$ trap 'today=$(date)' 10
$ echo $today
$ sleep 8
$ kill -10 $$
$ echo $today

Ahora puedes usar at para enviarte ($$) una señal al final del día.

información relacionada