在 tcsh 中,内置sched
命令会导致当前 shell 在指定时间执行命令。
我有以下$HOME/.sched
文件(这是它的简化版本):
setenv today `date +%F`
sched +00:01 sched 00:00 source $HOME/.sched
然后我source $HOME/.sched
在我的$HOME/.cshrc
.
$today
例如,这会将环境变量设置为"2012-06-25"
,并在每晚午夜自动将其更新为当前日期。该作业每次运行时都会自动重新安排自己。
请注意,该date
命令每天仅调用一次,并且仅在需要时调用。
有没有办法在 bash 中做到这一点?请注意,该at
命令将不起作用;它从外部调用命令,并且不会影响当前 shell 的环境。
(我知道我可以输入$(date +%F)
而不是输入$today
,但由于我交互地使用它,额外的输入是一个很大的负担。)
tcsh 还有许多特殊别名,在某些情况下会自动执行:
这蜂鸣命令,CWD命令,周期性的,预命令,后命令, 和作业命令 特殊别名可以分别设置当shell想响铃时执行命令、当工作目录改变时,每 时间段分钟、每个提示之前、每个命令执行之前、每个命令执行之后以及作业启动或进入前台时。
bash 有类似的东西吗?
答案1
你有没有尝试过$PROMPT_COMMAND
?例如,它通常用于设置 xterm 标题以显示 CWD。当出现提示时执行。也许可以用它来设置你的变量。第一个缺点是每次您在 shell 中按 Enter 键时都会执行您的命令。第二个是,如果长时间不在您的终端上活动并且一天过去了,它不会自动设置。下次在终端输入后它将被设置。
# 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
答案2
如果您愿意用两个反引号换取一美元:
alias today='date +%F'
echo `today`
如果您想要变量中的日期,那么更新它在PROMPT_COMMAND
这是我能想到的唯一方法。您可以使用内置变量避免在每次提示时分叉进程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"
另一种方法是通过键绑定插入文本。
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)"'
答案3
在我看来,您正在寻找at
:
~$ 现在 + 1 分钟 警告:命令将使用 /bin/sh 执行 at> 回显“测试” |墙 在> 工作 2 于 2012 年 6 月 25 日星期一 17:51:00 来自 user@host 的广播消息 (某处)17:51 ... 测试
不过,我刚刚重读了你的问题,你正在寻找能够重新自我安排的东西。通过at
调用一个 shell 脚本来完成它需要做的事情,然后设置一个新的at
作业,这很容易做到。但是,at
确实在自己的子 shell 中运行;不像您调用它的 shell 那样。
答案4
这可能会给您一个解决方案的想法:
$ trap 'today=$(date)' 10
$ echo $today
$ sleep 8
$ kill -10 $$
$ echo $today
现在您可以使用 at 在一天之交向自己发送 ($$) 信号。