# Bash: Script zu langsam in der Ausgabe

## solos

Hallo Forum,

ich bin vor einigen Tagen auf Xmonad umgestiegen und habe mir für die Statusleiste dzen ein Script gebastelt, das mir die Uhrzeit und den Status von fetchmail, sowie die Anzahl der Mails im inbox-Ordner anzeigt. Läuft alles soweit zufriedenstellend, bis auf die Tatsache, dass mein Script zu lahm ist :/

Die Ausgabe soll jede Sekunde aktualisiert werden, was mir eine Uhrzeit mit Sekunden erlaubt, aber leider springt er, da die Durchgänge laut time etwa 1,1sec brauchen:

 *Quote:*   

> ^fg(white)fetchmail: ^fg(red)off^fg(white) | mails: ^fg(green)2^fg(white) | Fr 23-04-2010 13:19:44^fg()
> 
> ^fg(white)fetchmail: ^fg(red)off^fg(white) | mails: ^fg(green)2^fg(white) | Fr 23-04-2010 13:19:45^fg()
> 
> ^fg(white)fetchmail: ^fg(red)off^fg(white) | mails: ^fg(green)2^fg(white) | Fr 23-04-2010 13:19:46^fg()
> ...

 

Da ich mich mit bash noch nicht so gut auskenne, möchte ich mal die bash-Profis bitten sich das folgende Script anzuschauen und mir Tipps zu geben, wie ich die Ausgabe der Uhrzeit besser hinbekommen kann. Ich habe schon drüber nachgedacht die Scripte zu trennen da ich denke, dass der "cat-Aufruf" zu lange braucht. Oder hat jemand eine bessere Idee?

fetchmail besorgt alle 5min neue E-Mails, trotzdem prüfe ich sekündlich den E-Mailordner, da ich ja in der Zwischenzeit Mails löschen oder verschieben kann.  :Wink: 

```
#!/bin/bash

INTERVAL=1

function fmail() {

        if [ -a ~/.fetchmail.pid ]; then

                FSTATE="^fg(green)on^fg(white)"

        else

                FSTATE="^fg(red)off^fg(white)"

        fi

        MAILS=`cat ~/mail/test | grep "Subject: " | wc -l`

        if [ $MAILS = 0 ]; then

                MSTATE=" | mails: ^fg(red)$MAILS^fg(white)"

        else

                MSTATE=" | mails: ^fg(green)$MAILS^fg(white)"

        fi

        echo -n "fetchmail: $FSTATE$MSTATE"

}

function fdate() {

        date +"%a %d-%m-%Y %H:%M:%S"

}

while true; do

        echo "^fg(white)$(fmail) | $(fdate)^fg()"

        sleep $INTERVAL

done
```

Ansonsten bin ich für alle Vorschläge und Kritik dankbar.

Grüße!

----------

## Finswimmer

cat ~/mail/test | grep "Subject: " | wc -l

geht schneller:

grep -c "Subject: " ~/mail/test

Tobi

----------

## mv

Gerade beim Forken (benötigt für `...`) braucht die Bash außergewöhnlich lange. Wenn Du "echo -n" bzw. "echo" durch "printf" ersetzt (ev. musst Du da dies Escape-Sequenzen anpassen) ist Dein Script POSIX. Du kannst also beispielsweise die viel flinkere dash anstelle der bash benutzen.

----------

## solos

Danke euch beiden! Leider hatte ich danach immer noch Sprünge. Zwar seltener, aber sie waren vorhanden.

Ich habe die eine Sekunde bei sleep jetzt einfach auf 0.9 gesetzt. So kann es zwar vorkommen, dass eine Sekunde zweimal auftaucht, aber da sich die Anzeige ja selber überschreibt ist das nicht so schlimm.

Grüße

----------

## Genone

Naja, in Nullzeit lässt sich das halt nicht erledigen, und wenn dann der sleep Aufruf schon eine Sekunde dauert ...

----------

