Bash
使用“at”命令
我的腳本輸出的這一部分
at: garbled time
對於循環中的每個索引,在
showRestNotification
此呼叫之前定義的函式在哪裡for i in {0..5} do at ${sleepTimes[$i]} -f showRestNotification done
在哪裡給出
echo ${sleepTimes[0]}
輸出看起來像
05/06/17 19:15
如何重新格式化我的變數以便它可以與 at 命令一起使用?但是,我需要保留日期,因為這對我的腳本的功能是必不可少的。
編輯:
睡眠時間函式
generateSleepTimes() { oldIFS=$IFS IFS=: splitTime=(${wakeUpTime##*-}) wakeUpHours=${splitTime[0]} wakeUpMinutes=${splitTime[1]} if [[ "$OSTYPE" == "linux-gnu" ]]; then currentHours=$(date +'%H') currentMinutes=$(date +'%M') elif [[ "$OSTYPE" == "darwin"* ]]; then currentHours=$(gdate +'%H') currentMinutes=$(gdate +'%M') fi if [[ $wakeUpHours -lt $currentHours ]]; then IFS=$oldIFS wakeUpTime="$wakeUpTime tomorrow" elif [[ $wakeUpHours -eq $currentHours && $wakeUpMinutes -lt $currentMinutes ]]; then IFS=$oldIFS wakeUpTime="$wakeUpTime tomorrow" else IFS=$oldIFS wakeUpTime="$wakeUpTime today" fi if [[ "$OSTYPE" == "linux-gnu" ]]; then tempTime=$(date -d "$wakeUpTime - 15 minutes" +"%D %H:%M") elif [[ "$OSTYPE" == "darwin"* ]]; then tempTime=$(gdate -d "$wakeUpTime - 15 minutes" +"%D %H:%M") fi if [[ "$OSTYPE" == "linux-gnu" ]]; then sleepTimes[6]=$(date -d "$tempTime" +"%D %H:%M") elif [[ "$OSTYPE" == "darwin"* ]]; then sleepTimes[6]=$(gdate -d "$tempTime" +"%D %H:%M") fi for i in {5..0} do if [[ "$OSTYPE" == "linux-gnu" ]]; then sleepTimes[$i]=$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%D %H:%M") elif [[ "$OSTYPE" == "darwin"* ]]; then sleepTimes[$i]=$(gdate -d "${sleepTimes[$i+1]} - 1 hour" +"%D %H:%M") fi done echo "${sleepTimes[@]}" }
你的命令
at -f ${sleepTimes[$i]} showRestNotification
指示準時
at
執行。${sleepTimes[$i]}``showRestNotification
at
時間規範是亂碼,即不是您的系統可辨識的格式。at
從標準輸入(或使用時從文件-f
)讀取。您需要閱讀
at
系統上的文件以查看時間規範需要採用什麼格式。在我的系統(不是 Linux)上,它說它應該是 format[[cc]yy]mmddHHMM[.SS]
,即201705061915
5 月 6 日 19:15 2017 年。此外,由於
at
從標準輸入(或使用時從文件-f
)讀取要執行的命令,因此您必須為其提供一個 shell 腳本,其中包含您要執行的函式的定義,以及對它的正確呼叫, 例如:#/bin/sh # this is "job.sh" showRestNotification () { # ... } showRestNotification
然後,
at -f job.sh -t 201705061915
或者
at 201705061915 <job.sh
由於
at
將執行指定的文件,因此如果您想使用-specific shell 構造/bin/sh
,您將需要呼叫bash
包含函式定義和呼叫的腳本。job.sh``bash
您的程式碼的可移植性提示:
date () { case "$OSTYPE" in darwin*) command gdate "$@" ;; linux*) command date "$@" ;; *) printf 'Unsupported OS type: %s\n' "$OSTYPE" >&2 exit 1 ;; esac }
然後只需使用
sleepTimes[$i]="$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%Y%m%d%H%M")"
無需
$OSTYPE
到處測試。