ubuntuusers.de

Für diese Funktion musst du eingeloggt sein.

BASH. Zeitdifferenz mit Funktion ermitteln

Status: Gelöst | Ubuntu-Version: Kubuntu 18.04 (Bionic Beaver)
Antworten |

michahe

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Hallo,

in einem Bash-Skript (mit langer Laufzeit) möchte ich mehrfach an bestimmten Kontrollpunkten die bis dahin verstrichene Zeit ausgeben und dachte an ein Funktionen; aber meine Berechnung klappt nicht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash
function timestamp()
{
    date +%Y-%m-%dT%H:%M:%SZ
}

function duration()
{
 t2=$(timestamp)
# date -u -d "0 $t2 sec - $t1 sec" +"%M:%S [mm:ss]" # dieser Ansatz ist FALSCH
}

t1=$(timestamp)
echo $t1
sleep 2
echo "Dauer bisher: $(duration)"

Wie mache ich's richtig? Danke, Michael

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Ich würde einfch mit dem timestamp rechnen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function timestamp() {
  date +%s
}

startzeit=$(timestamp)
sleep 1 #23;
jetzt=$(timestamp)

date -d @$jetzt +'%Y-%m-%dT%H:%M:%SZ'
date -d @$startzeit +'%Y-%m-%dT%H:%M:%SZ'
echo $jetzt minus $startzeit
echo Differenz: $((jetzt-startzeit))

fork991

Anmeldungsdatum:
26. Mai 2010

Beiträge: 58

Erklärungen zu diesem timestamp("Epoch"):

https://de.wikipedia.org/wiki/Unixzeit

coram

Anmeldungsdatum:
17. Januar 2015

Beiträge: 645

Wohnort: Freiburg

Eine Alternative mit ps:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

function duration()
{
    ps -o etime= -C "$(basename $0)"
}

sleep 2
echo -n "Dauer bisher:"
duration

ps gibt hier die vergangene Zeit (Option -o etime=) des laufenden Skripts (Option -C "$(basename $0)") aus.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Danke Euch,

ich habe schließlich die Methode von ChickenLipsRfun2eat etwas umgebaut, da der Aufruf ja mehrfach benötigt wird, und noch formatiert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash
function TimeUsed() {
   TimeNow=$(date +%s)
#   date -d @$TimeNow   +'%Y-%m-%dT%H:%M:%SZ'
#   date -d @$TimeStart +'%Y-%m-%dT%H:%M:%SZ'
   TimeUsed=$((TimeNow-TimeStart))
   echo "Zeit Dauer [hh:mm:ss]: "$(printf "%.2i\n" $((TimeUsed / 3600)))":"$(printf "%.2i\n" $((TimeUsed % 3600 / 60)))":"$(printf "%.2i\n" $((TimeUsed % 60)))
}

TimeStart=$(date +%s)
sleep 61
TimeUsed   # Function aufrufen

Irgendwelche Gegenanzeigen? Verbesserungspotential?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Du kannst printf auch mit mehreren Argumenten aufrufen: Liest sich besser:

1
printf '[hh:mm:ss]:%.2d:%.2d:%.2d\n' $((TimeUsed / 3600)) $((TimeUsed % 3600 / 60)) $((TimeUsed % 60))

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Danke! Erledigt ...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Oder mit "date" die Ausgabe formatieren:

1
date -d "1970/01/01 +$TimeUsed seconds" +"Zeit Dauer [hh:mm:ss]: %H:%M:%S"
Antworten |