Bash

經過時間計數

  • May 3, 2021

我有一個小腳本(基本上很簡單,這是我寫的第一個腳本)並且喜歡知道經過的時間,完成後需要多長時間。

是否可以計算兩個變數之間的差異?( $ SSS and $ EEE),我也嘗試過使用 $SECONDS,但結果為 0。

可能需要使用不同的方式來完成這項工作,所以我需要知道如何解決這個問題。

我的腳本:

echo "****************************************************************************"
SECONDS=0
#!/bin/bash
SSS=$(date '+%Y.%m.%d. @ %H:%M:%S')
echo "Start time: ${SSS}"
echo ""
echo "Starting update and upgrade"
echo "==================================="
sudo apt-get update && sudo apt-get upgrade -y
echo ""
echo "Starting autoremove"
echo "==================================="
sudo apt-get autoremove -y
echo ""
echo "Starting autoclean"
echo "==================================="
sudo apt-get autoclean -y
echo ""
echo "Check for Pi-Hole update"
echo "==================================="
sudo pihole -up
echo ""
echo "Starting gravity update for Pi-Hole"
echo "==================================="
sudo pihole -g
echo ""
EEE=$(date '+%Y.%m.%d. @ %H:%M:%S')
echo "Start time: ${SSS}"
echo "End   time: ${EEE}"
duration=$SECONDS
echo "Elapsed time $(($duration / 60)) minutes and $(($duration % 60)) seconds."
echo "****************************************************************************"

您的腳本的問題與命令的時間無關。您的腳本的問題在於它在與您從命令行執行它的環境不同的環境中執行。

例如,PATH變數可能不同導致找不到某些實用程序,或者腳本中存在互動元素,當腳本在非互動環境中執行時顯然無法執行。

您還在評論sh中提到您使用而不是啟動腳本bash,這另外意味著該SECONDS變數可能不存在(取決於sh恰好由哪個外殼實現)。

我可以看到該腳本使用sudo. 這導致我建議您應該在 root 自己的 crontab 中執行腳本,而不是在非特權使用者帳戶的 crontab 中執行(並sudo從腳本中刪除所有呼叫)。sudo crontab -e使用.修改 root 使用者的 crontab

此外,請確保PATH將腳本中的變數設置為目錄列表,以便您找到您使用的所有實用程序。例如,

#!/bin/bash

PATH=/bin:/usr/bin:/usr/local/bin:$PATH

SECONDS=0

apt-get update && apt-get upgrade

# etc.

您應該特別確保該PATH變數包含所在的目錄apt-get和所在的目錄(在命令行中使用和pihole查找這些目錄)。command -v pihole``command -v apt-get

還要確保#!-line 是文件的第一行(如我在範例中所示)。問題中的程式碼沒有這樣做。請注意,如果在呼叫腳本時在命令行上使用顯式解釋器,則完全忽略#!-line 。

引用自:https://unix.stackexchange.com/questions/647692