En tcsh, el comando incorporado sched
hace que el shell actual ejecute un comando en un momento específico.
Tengo el siguiente $HOME/.sched
archivo (esta es una versión simplificada):
setenv today `date +%F`
sched +00:01 sched 00:00 source $HOME/.sched
Yo entonces source $HOME/.sched
en mi $HOME/.cshrc
.
Esto establece la variable de entorno $today
en, 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 date
comando 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 at
comando 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_COMMAND
es 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 at
llamando a un script de shell que haga lo que necesita hacer y luego configure un nuevo at
trabajo. Sin embargo, at
se 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.