Sida 1 av 1

tick tock - klockan går

Postat: 21 aug 2007, 09:49
av per9000
Hej alla glada, fanatisk terminal-nörd som jag är har jag nu porterat ett gammalt kommando från C# till Python och nu till bash. (Antalet rader har gått från många till 3).

tick skriver den nuvaranden tiden (i nanosekunder sedan epokens början) i filen ~/.tick
tock läser den senaste tick-tiden och jämför med nuvarande tid och skriver ut skillnaden.

Bra om man vill mäta tiden på något - då kan man köra

Kod: Markera allt

tick && ngt_som_tar_tid && tock
Om någon vet något bättre sätt är jag mycket nyfiken på det. Jag skulle till exempel gärna ha bara en rad i tock, men jag vill bara läsa filen en gång. (Dessutom vill jag absolut lagra filen så man kan kolla hur lång tid det tar att åka tåg hem eller något annat som kräver att datorn är av).

Kod: Markera allt

tick
------------
#!/bin/bash
date +%s%N > ~/.tick

tock
------------
#!/bin/bash
declare -i NANOS=$((`date +%s%N` - `cat ~/.tick`))
echo $(($NANOS/1000000000)).$(($NANOS%1000000000))
Ciao,
Per

SV: tick tock - klockan går

Postat: 21 aug 2007, 09:50
av per9000
PS: jag har redan hittat en bugg :D

SV: tick tock - klockan går

Postat: 21 aug 2007, 10:01
av per9000
per9000 skrev: [...]
Bra om man vill mäta tiden på något - då kan man köra

Kod: Markera allt

tick && ngt_som_tar_tid && tock
[...]
Ha, ha, ha. Jag behöver verkligen jobba på mina bash-kunskaper. Denna funktionalitet finns redan:

Kod: Markera allt

time ngt_som_tar_tid
*hänger med huvudet i skam*

/Per

SV: tick tock - klockan går

Postat: 21 aug 2007, 10:03
av Barre
per9000 skrev:
per9000 skrev: [...]
Bra om man vill mäta tiden på något - då kan man köra

Kod: Markera allt

tick && ngt_som_tar_tid && tock
[...]
Ha, ha, ha. Jag behöver verkligen jobba på mina bash-kunskaper. Denna funktionalitet finns redan:

Kod: Markera allt

time ngt_som_tar_tid
*hänger med huvudet i skam*

/Per
hehe
Det är detta som är tjusningen med datorer... det finns MÅNGA sätta att få samma resultat :)

SV: tick tock - klockan går

Postat: 21 aug 2007, 10:36
av per9000
Någon bash-guru som kan förklara varför detta:

Kod: Markera allt

#!/bin/bash
declare -i NANOS=$((`date +%s%N` - `cat ~/.tick`))
echo $(($NANOS/1000000000)).$(( ${NANOS:(-9)} ))
(i kombination med tick ovan) ibland ger denna error

Kod: Markera allt

>tock
/home/per/bin/tock: line 3: 070024937: value too great for base (error token is "070024937")
Det som händer är att antalet nano-sekunder börjar med en eller flera nolla/or och jag vill skriva ut det som N.012345678 och inte N.12345678 som den gjorde först.

Tacksam för tips,
Per

SV: tick tock - klockan går

Postat: 21 aug 2007, 11:27
av Konservburk
Det är för att ett tal som börjar med 0 tolkas som oktalt av $(()),
vilket innebär att du får ett felmeddelande  om 8 eller 9 finns
med i talet. I annat fall får du helt enkelt fel resultat.

Kod: Markera allt

bash$ echo $((08))
bash: 08: value too great for base (error token is "08")
bash$ echo $((010))
8
Plocka bort $(()) så fungerar det bättre.

Kod: Markera allt

echo $((NANOS/1000000000)).${NANOS:(-9)}

SV: tick tock - klockan går

Postat: 21 aug 2007, 13:05
av per9000
supernice  ;D