人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

shell進(jìn)度條追蹤指令執(zhí)行時(shí)間的場景分析

發(fā)布日期:2022-07-20 19:35 | 文章來源:源碼之家

最近一兩年,我經(jīng)手了不少與shell相關(guān)的工作。在這個(gè)過程中,我越發(fā)覺得shell腳本在完成具體任務(wù)的同時(shí),應(yīng)該再給用戶展示一個(gè)進(jìn)度條,用以提示當(dāng)前階段還需要多少時(shí)間才能完成。

linux中的不少軟件都有進(jìn)度條,比如yum的軟件安裝過程,docker的鏡像拉取過程。本想借鑒這些軟件的進(jìn)度條的實(shí)現(xiàn)方法,但其開發(fā)語言大都不是shell,我就只好作罷。隨后,我在網(wǎng)上搜索shell進(jìn)度條的實(shí)現(xiàn)方法,而找到的大都是用for或while循環(huán)在控制臺上直接打印等號或箭頭,并在循環(huán)體中用sleep命令實(shí)現(xiàn)一個(gè)固定的停頓,因而進(jìn)度條完成的時(shí)間是固定的,而且在打印進(jìn)度條時(shí)也沒有實(shí)現(xiàn)具體任務(wù)。那種進(jìn)度條是完全沒有意義的。

于是,我就自己實(shí)現(xiàn)了一個(gè)shell進(jìn)度條,測試表明實(shí)現(xiàn)了既定目標(biāo)??梢宰粉欀噶畹膱?zhí)行時(shí)間。如果在預(yù)定用時(shí)之前完成,那么進(jìn)度條會接到通知,然后立刻跑完剩余進(jìn)度;如果指令的運(yùn)行用時(shí)超出預(yù)定時(shí)間,那么進(jìn)度條會在96%的地方等待指令跟上,然后再跑完剩余的4%。

本文中的進(jìn)度條可以應(yīng)用于大部分場景。不用修改進(jìn)度條函數(shù)的任何代碼,就可以直接使用。特別適合那些可預(yù)估指令執(zhí)行時(shí)間的場景。對于如下載、文件復(fù)制等可以準(zhǔn)確地計(jì)算出進(jìn)度數(shù)值的情況,也可以基本滿足,還可以參考本文的思路,修改進(jìn)度條函數(shù),進(jìn)而顯示精確的進(jìn)度數(shù)值。

代碼

代碼如下:

#!/bin/bash
progressBarTempPath=$(mktemp)
echo "0" >"$progressBarTempPath"
progressBar () {
  local time=$1
  local interval=1
  if [[ "${time}" == *"s" ]]; then
 interval=$(echo "scale=5;${time//s/}/60"|bc)
  elif [[ "${time}" == *"m" ]]; then
 interval=${time//m/}
  else
 echo "進(jìn)度條參數(shù)錯(cuò)誤"
 return 1
  fi
  local nowNum=1
  local str=''
  local postfix=('/' '-' '\' '|')
  while [ $nowNum -le 100 ]; do
 local needEnd=`cat "$progressBarTempPath"`
 local index=$((nowNum%4))
 printf "[%-50s %-3d%% %c]\r" "$str" "$nowNum" "${postfix[$index]}"
 nowNum=$((nowNum+1))
 if [ $needEnd -eq 1 ]; then
  sleep 0.1
 else
if  [ $nowNum -le 20 ] ; then
 sleep  $interval
elif [  $nowNum -gt 95  ];then
 local nowNumCopy=$nowNum
 while [ $needEnd -eq 0 ]; do
  sleep $interval
  local innerIndex=$(((nowNumCopy+1)%4))
  printf "[%-50s %-3d%% %c]\r" "$str" "$nowNum" "${postfix[$innerIndex]} "
  needEnd=$(cat "$progressBarTempPath")
  nowNumCopy=$((nowNumCopy+1))
 done
else
 sleep $(echo "scale=5;${interval}/2"|bc)
fi
 fi
 if (($nowNum % 2 == 0)); then
str+='='
 fi
  done
  printf "\n"
}
# 多線程調(diào)用進(jìn)度條函數(shù),參數(shù)表示預(yù)估的大概時(shí)間。參數(shù)中的s表示時(shí)間單位秒,還可以用m表分鐘。
progressBar 20s &
# 調(diào)用進(jìn)度條后,就是完成具體操作的代碼。
echo "模擬一個(gè)24秒執(zhí)行完成的任務(wù)。"
sleep 24
# 通知進(jìn)度條函數(shù)完成進(jìn)度
echo "1" >"$progressBarTempPath"
wait

使用說明

使用非常簡單,按照以下兩步操作即可。

  • 將代碼中的第56、57行換成您實(shí)際需要執(zhí)行的命令。最好屏蔽其運(yùn)行過程中的輸出。
  • 將代碼中第53行的方法調(diào)用參數(shù)20s換成你預(yù)估的實(shí)際時(shí)間。

效果展示

到此這篇關(guān)于shell進(jìn)度條如何追蹤指令執(zhí)行時(shí)間的文章就介紹到這了,更多相關(guān)shell進(jìn)度條追蹤指令執(zhí)行時(shí)間內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

香港服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部