在 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 在一天之交向自己發送 ($$) 訊號。