我有一個 bash 腳本,在某些時候我使用 echo 將一些訊息放入日志檔案中。我遇到的問題與 DATE 變數有關,該變數在腳本的整個執行程序中都是靜態的。
我在下面有這個基本腳本來說明問題:
#!/bin/bash
DATE=`date "%Y-%m-%dT%H:%M:%S%:z"`
echo "script started at $DATE"
echo "doing something"
sleep 2
echo "script finished at $DATE"
如果我執行此腳本,則 $DATE 變數的輸出在兩行中都是相同的。是否有一些 bash 魔法可以很好地解決這個問題,而不必在每一行上用命令本身替換 $DATE?
提前致謝
uj5u.com熱心網友回復:
使用 bash 4.3 版本,您可以使用內置printf格式來格式化日期時間。-1下面是一個神奇的值,意思是“現在”。
#!/bin/bash
datefmt='%Y-%m-%dT%H:%M:%S%z'
printf "script started at %($datefmt)T\n" -1
echo "doing something"
sleep 2
printf "script finished at %($datefmt)T\n" -1
bash 不認識%:z我。
uj5u.com熱心網友回復:
較新版本的bash/printf內置支持生成日期時間戳,而無需生成子行程來呼叫date:
$ builtin printf --help
...snip...
Options:
-v var assign the output to shell variable VAR rather than
display it on the standard output
...snip...
In addition to the standard format specifications described in printf(1),
printf interprets:
%b expand backslash escape sequences in the corresponding argument
%q quote the argument in a way that can be reused as shell input
%(fmt)T output the date-time string resulting from using FMT as a format
string for strftime(3)
... snip ...
而不是產生一個子行程來呼叫date,例如:
logdt=`date "%Y-%m-%dT%H:%M:%S:%z"`
同樣可以通過printf -v將所需格式包裝在中來完成%(...)T,例如:
printf -v logdt '%(%Y-%m-%dT%H:%M:%S:%z)T'
注意:假設%:z應該是:%z
假設您將使用日期時間戳標記很多行,那么消除子行程date呼叫所節省的費用可能是巨大的。
運行 1000 個日期時間戳生成的測驗:
$ time for ((i=1;i<=1000;i )); do { printf -v logdt '%(...)T' | logdate=$(date ...) }; done
時間安排printf -v logdt '%(...)T':
real 0m0.182s # ~130 times faster than $(date ...)
user 0m0.171s
sys 0m0.000s
時間安排logdt=$(date ...):
real 0m24.443s # ~130 times slower than printf -v
user 0m5.533s
sys 0m16.724s
uj5u.com熱心網友回復:
這可以幫助您:
#!/bin/bash
echo "script started at $(date '%Y-%m-%dT%H:%M:%S%:z')"
echo "doing something"
sleep 2
echo "script finished at $(date '%Y-%m-%dT%H:%M:%S%:z')"
如果呼叫完整命令對您來說很笨拙,您可能需要創建一個別名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/463866.html
上一篇:使用python從文本/javascript中提取資料
下一篇:使用systemD需要等待嗎
