Posts by tdl

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!

    Der Funktionsame ist ja quasi richtig aber der sollte halt nicht sein, weil der Inhalt der Funktion nicht so sein sollte. Funktionen sollten möglichst einen Job erledigen und einzeln testbar sein.

    Die Funktion hat die Aufgabe die übergebenen Argumente zu prüfen. Was aber bringt eine Prüfung wenn nicht auf das Prüfergebnis reagiert wird je nachdem wie es ausfällt? Die Funktion hat also bereits an dieser Stelle zwei Jobs: Prüfen und Reagieren.

    Jetzt gibt es verschiedene Möglichkeiten der Eingabe und auch der Falscheingabe. Deshalb wird die Prüfung aufgeteilt. Hier durch die If Abfrage.

    Als erstes wird geprüft ob das 1. Argument vielleicht genau eine "99" ist. 99 Ist die vorgesehene Eingabe um den Wecker auszustellen, die Weckzeit zu löschen. Was dann auch geschieht. Danach wird das Programm beendet. Wie ich weiter oben schon schrieb, gibt es ja in diesem Fall auch keinen Grund für das Programm weiter zu laufen. Prüfung >> direkte Reaktion auf Ergebnis der Prüfung.

    Als nächstes kommt das elif. Hier wird geprüft ob Argument 1 + 2 im jeweils richtigen Bereich liegen. Tun sie das nicht, Wird der entsprechende Hinweis gegeben wie die Eingabe zu erfolgen hat und in welchen Bereichen sich die Eingaben befinden müssen.

    Haben die Argumente diese Prüfungen überstanden gehts weiter im Programm. Aber halt. was wenn jemand gar nichts eingibt oder es gar mit Buchstaben versucht? Dan greifen die Ausnahmeregelungen aus dem except. Weisen darauf hin, dass nur Ziffern akzeptiert werden und beendet das Programm.

    Natürlich kann man daraus 2 Funktionen machen. Man kann auch die Stunden und Minuten in einer jeweils getrennten Funktion überprüfen. Und dann kommt der nächste und sagt, dass man das aber auch alles in einer Funktion zusammenfassen kann. Viele Wege führen zum Ziel. Ob nun Weg a oder Weg b der "bessere" oder "schönere" ist sei da mal dahin gestellt.


    Das erste exit() konnte übrigens tatsächlich weg, die beiden anderen müssen aber bleiben. Die haben einen Sinn. Sie unterdrücken die Fehlermeldungen des Systems und geben ausschließlich den von mir für den jeweiligen Fall vorgesehenen Text aus.


    Beim Range verstehe ich was du meinst, aber da wir hier nicht von Listen mit 1,8 Millionen Einträgen reden sonder 24 bzw 60 sind diese Bedenken m. E. vernachlässigbar. Auch hier: Änder ich es (wieder zurück, das hatte ich ja schon mal) kommt der nächste und meint "Ich mach das aber anders..." Zusätzlich werden die Eingaben auch noch auf der Webseite auf Richtigkeit geprüft, <input type="number">


    Zu der Sache mit dem Path hast du jetzt zwei mal vage Andeutungen gemacht, dann mach aber auch mal "Butter bei die Fische".


    Thema Sniper: Ich glaube dem Programm ist es egal ob es jetzt von einem Python Script oder einem professionellen Bashkiller abgeschossen wird.

    Das Bashscript "sniper" habe ich auch für andere Sachen im Einsatz. Es hat sich bewährt und ist doch völlig ausreichend. Nur des guten Geschmacks wegen werd ich da jetzt nichts neues schreiben.


    Eine gute Nacht, ich mach jetzt Schluss


    Thorsten

    Man sieht am Funktionsnamen `args_checken_loeschen_plausi()` eigentlich schon das diese Funktion zu viel macht.

    Über Namensgebung lässt sich streiten, man könnte sie auch einfach "eingaben_pruefen()" nennen. Ob sie zu viel macht? In einer früheren Version sah es so aus (Beitrag #22). Da ist nicht mehr viel von der "plausi_check()" übriggeblieben. Und da beide Funktionen letzlich die Argumente überprüfen, was lag da näher, als sie zusammenzulegen. Die Reihenfolge ist zwingend. Die "exits" sind notwendig und Bestandteil des korrekten Programmablaufs (Beitrag #28).

    Die ``while``-Schleife macht keinen Sinn, weil die *immer* mindestens einmal durchlaufen wird und *immer* ersten Durchlauf abgebrochen wird. Damit ist das keine Schleife.

    Ich gehe mal davon aus, dass du mit "die 'while'_Schleife die erste von beiden meinst. Hab ich eben probiert stimmt, die ist jetzt weg. Danke.

    Ein ``x in range(a, b)``-Test ist ungewöhnlich bis falsch. Da muss man hoffen, dass der Wertebereich recht klein ist,

    Ungewöhnlich kann ich nicht beurteilen, aber für falsch funktioniert es einfach zu gut ;) . Auch muss man da nichts hoffen, der Wertebereich ist doch klar definiert und steht im Code. Ehrlich gesagt finde ich das sogar eleganter als mit kleiner, größer, gleich Abfrage.

    `log_schreiben()` geht kürzer — `Path`-Objekte haben da eine passende Methode.

    Wenn du auf Path.open() anspielst, dann ist es tatsächlich kürzer. Um ein Zeichen. Falls du was anderes gemeint hast: Entschuldige bitte meinen Sarkasmus :)

    Code
    def log_schreiben(logtext):
        with LOG_DATEI.open("w", encoding="ascii") as datei:
        with open(LOG_DATEI, "w", encoding="ascii") as datei:
            datei.write(logtext)


    Was macht das Sniper-Skript eigentlich? Doch nicht etwa *dieses* Programm abschiessen‽ Das könnte sich ja einfach selbst beenden.

    Mit Verweis auf Beitrag #17. Doch genau das macht sniper. Wie im echten Leben. Peng und weg! Wie beendest du denn einen Prozess? In der Regel wird der Wecker ja auch nicht in der Konsole gestartet sondern über ein Webinterface gestellt und wieder ausgeschaltet. da läuft eine Instanz des Programms in einer Endlosschleife im Hintergrund. Wie soll ich der denn sonst sagen dass sie sich beenden soll?


    Danke für deine Anregungen. Aber das Programm läuft fehlerfrei und macht genau das was es machen soll.

    *In* einer f-Zeichenkette braucht man kein `strftime()` aufrufen, da kann man die Formatierung direkt über die Platzhaltersyntax regeln:

    Danke für den Hinweis, habs direkt umgeschrieben.

    Das kann man anders regeln als mehrfach die Funktion print() aufzurufen. ;)


    Z.B. so:
    Code print(f"{FEHLER}\nWert für Stunden : 0-23" \ "Wert für Minute : 0-59" \ "\nWecker ausstellen: ./wecken.py 99\n")

    Mann könnte der Übersicht wegen auch nach der öffnenden und vor der schließenden runden Klammer in eine neue Zeile gehen.

    Das ist praktisch. Danke. Ich hab da grad mal mit rumgespielt, man bräuchte dann auch nicht mehr entsprechend einrücken. Aber dann wird unübersichtlich.

    dann geht es nicht? Das würde mich schwer wundern oder wir haben aneinander vorbei geredet.


    Zum Vergleich nochmal dein Original, damit du weist was ich gemeint habe:

    Nein, haben wir nicht, ich hab schlampig getestet. Ich hatte es nur aus der Funktion unten entfernt. Ok, funktioniert auch ohne, wenn ich es aus beiden Funktionen rausnehme.

    'weckzeit_in_log_schreiben' auch das Argument 'weckzeit', dass gar nicht benutzt wird.

    Kam mir auch komisch vor, aber es wird tatsächlich benötigt, da "weckzeit" im "logtext" verwendet wird.

    Wenn du aus der Dauerschleife ausbrechen willst ist die gängige Methode 'break' anstatt 'exit()' zu verwenden. Wenn du im 'else'-Zweig 'True' zurück gibst, benötigst du kein 'break' mehr, die Dauerschleife wird auch verlassen.

    Auch die exits sind so richtig, ich möchte dort ja nicht einfach nur aus der Schleife raus, sondern wirklich das Programm an dieser Stelle komplett verlassen. Habs mit break versucht. Das hat, soweit ich das überblicke zur Folge, dass ich zwar aus der Schleife raus bin aber das Programm versucht mit den fehlerhaften Werten weiter zu machen, was dann wieder Fehlermeldungen nach sich zieht. In der Funktion plausi_check(). und auch in der Funktion check_args_auf_loeschen() macht es ja keinen Sinn, wenn das Programm weitermacht, mit was auch?


    plausi_check() konnte ich mittlerweile dank range() um einiges kürzen:

    Ja, auch die Printzeilen könnte man in einer zusammenführen, ich hasse es aber horizontal scrollen zu müssen :daumendreh2:

    Auch wenn du das so angibst, wie ich es vorgeschlagen habe?

    Auch guten Morgen,


    ja, so klappt es. aus den Docs lese ich aber eher, dass man das macht wenn mehrere Element zusammengefasst werden. Mein Pfad sieht aber nicht nach mehreren Elementen aus, keine Leerzeichen, keine Kommas. Der Punkt vor der Dateiendung kann es auch nicht sein, bei *txt geht es ja problemlos ohne eckige Klammern. Aber nach dem was ich gelesen habe, was das alles kann, bin ich ja mal gespannt ob ich je auf den Stand kommen werde es auch zu brauchen :lol:


    Ich würde einfach Mal das schedule-Module einwerfen.

    Der Einwurf ist klasse! Hättest du den nicht bereits vor einer Woche machen können? :)

    Und gleich auch gelernt, das schedule mit sch am Anfang geschrieben wird. Das werd' ich in der nächsten Version bestimmt einbauen.

    Ich hab jetzt nichts dazu gefunden, aber geht damit auch so was wie "schedule.von-mai-bis-august"?


    Thorsten

    Du siehst, erst durch 'check=True' wird Python gemeldet, dass mit dem 'run'-Befehl etwas nicht stimmt und erst jetzt kann man im Programm darauf reagieren. Anders würde das Programm durch laufen, als sei der 'run'-Befehl erfolgreich ausgeführt worden. (Also je nach dem was da so gemacht wird).

    Guten Abend, so wird da ein Schuh draus. In deinem Beispielcode aus dem anderen Beitrag stand dieser Ausschnitt;

    Code
    def check_input():
        if argv[1] == '99':
            print('gelöscht')
        else:
            return True
    
    
    def main():
        if check_input():

    und schreibst weiter unten:

    Quote


    Um den Erfolg des Befehls zu registrieren, dazu ist auch das 'check=True' da. Funktioniert etwas nicht, dann wird eine Ausnahmebehandlung ausgeführt und man kann entsprechend reagieren.

    im Code steht das mit dem "check-True" so nicht drin. Und dann beginnt deine main() mit if check_input():. Das hab ich nicht verstanden und mir zusammengereimt "Wenn Check_input ein True zurückgibt, dann.. :". Aber eine Ausgabe hab ich nicht bemerkt. Jetzt mit deinem Beispielen mit und ohne ergibt das mehr Sinn. Hab ich verstanden, ich denke aber, ich werde es hier aber nicht einsetzen. Auch aus Gründen im nächsten Absatz.


    Dann meintest du das mit dem String vor dem Path ist unnötig. Muss ich widersprechen, im Code gleich mehr. Ich hab Path zuerst ohne str und beim zweiten mal mit ausgeführt. Was man bei der 2. Ausführung auch schön sehen kann: Ich bekomme eine Meldung von Sniper, dass er erfolgreich war und auch vom System, dass der Prozess terminiert wurde. Das reicht mir dann an Meldungen, zumal ich sie im Hauptbedienelement, der Webseite, sowieso nicht zu sehen bekomme.

    Anscheinend hat subprocess Probleme mit pathlib.Path. Man findet mehrere Beiträge im Netz dazu. Die Lösung mit dem String hab ich dann hier gefunden.


    Bei der Funktion "plausi_check()" bin ich auch noch nicht am Ende, aber doch erst mal happy, dass sie tatsächlich funktioniert. Das verfeinern, vereinfachen bis hin zum komplett umschreiben kommt garantiert.


    P.S wenn ich mich unklar ausgedrückt habe, einfach sagen.

    Nö, nur manchmal ist die Materie an sich "unklar". Mir zumindest. Da brauch ich dann noch Schubser aus anderen Richtungen zu gleichen Thema, dann fällt ja meist der Groschen. Und ich lerne ständig dazu. Python ist meine erste "Hochsprache" in die ich tatsächlich reinkomme. Ich habs mal mit C/C++ versucht, da kam ich aber irgendwie gleich am Anfang schon nicht weiter. Und mit "Atari-Basic" aus den 80ern kommt man ja heute auch nicht mehr weiter :lol:


    Dann sag ich dir - und natürlich auch allen anderen Beteiligten hier im Thread - mal Dankeschön für diese ganze Arbeit mit mir! :danke_ATDE:


    Bis zum nächsten Problem

    Viele Grüße


    Thorsten

    schaue dir doch so Sachen nochmals an und vergleiche das mit deinem jetzigen Code.

    Du kannst dir auch mal Schritt für Schritt anschauen, wie du die Abfrage nach der richtigen Eingabe gemacht hast und wie das bei mir abläuft.

    Das mit Zeile 14 und den doppelten Klammern war mir auch noch aufgefallen und ich hatte sie entfernt. Hat sich mit deiner Antwort überschnitten.

    Ich hab jetzt lang getüftelt und auch die Ausnahmeregelungen geschafft.

    Das mit der zeitwert.minute funktioniert so leider nicht, da er dann nur die Minute nimmt und die Stunde außer acht lässt. Soll heißen bei einer angenommenen Weckzeit von 08:30 weckt auch um 09:30, um 10:30, ... , was nicht so optimal ist. :sleepy: Ich hab es aber dann trotzdem mit strftime() auf Minuten formatiert (Was die Wartezeit beim testen enorm verkürzte).


    Hab (ich hoffe mal) alle Varianten von Falscheingaben probiert und es klappt soweit. Sie werden alle abgefangen und kommentiert, bis hin zum Userabruch durch STRG+C, da werden dann sogar die Weckzeiten in der weckzeit.txt wieder gelöscht.


    Hier jetzt also mein überarbeiteter Code der diesmal hoffentlich weniger Kritikpunkte aufzuweisen hat.

    vg


    Thorsten

    Wenn ich deinen Code jetzt mit meinen Verbesserungsvorschlägen ändere, dann kommt wieder so ein ähnlicher raus, wie ich schonmal geschrieben habe, von dem her habe ich darauf verzichtet und setze den Link dazu nochmal rein. Du kannst deinen Code, meinen Code und meine Kommentare noch mal vergleichen, falls etwas nicht klar ist.

    Keine Musterlösung, sondern nur mein Vorschlag:

    Danke für die vielen Kritikpunkte.

    Mit der Übergabe von Argumenten habe ich tatsächlich noch arge Probleme. Deshalb auch der sich wiederholende Code, sonst hatte immer wieder was gemeckert "xy is not defined". Und dann hab ich mich einfach in dieser (falschen) Arbeitsweise verstrickt und war froh es irgendwie hingefrickelt bekommen zu haben. Trugschluss. Außerdem lief es dann doch nicht richtig habe ich bemerkt. Fazit: Weg damit, nochmal machen.


    Heute habe ich es noch einmal neu geschrieben. Diesmal wirklich Funktion für Funktion einzeln und immer wieder zwischengetestet.

    Variablen-, Pfad- und Funktionsnamen habe ich aussagekräftiger gestaltet (hoffe ich).

    Die Write Geschichte habe ich, dank deiner tollen Erklärung oben zum Argumente übergeben, jetzt tatsächlich so hinbekommen dass sie nicht jedesmal meckert "es wäre kein text definiert, welchen ich jetzt logtext genannt habe.

    Das mit der "Minutenabfrage" hab ich erst mal hinten angestellt. Da muss ich doch dann nur bei uhrzeit das :&S entfernen und die weckzeit genauso formatieren?


    Es wird empfohlen dem subprocess-Aufruf immer die check-Option mitzugeben. Wenn das fehlt gibt subprocess immer ein erfolgreich ausgeführter Befehl zurück, auch wenn dieser an sich nicht erfolgreich war. Das kann zu Problemen bei der Fehlerbehandlung/Ausnahmebedingungen führen.

    Das hab ich noch nicht verstanden. Wie es gemacht wird, was die Rückgaben bedeuten und was ich damit anfangen kann. Also eigentlich alles an der Sache :)

    Der Wecker wird ja eigentlich auch nur über die Web-Oberfläche bedient, und die lässt gar keine Falscheinggaben zu. Die können ja nur über die Konsole gemacht werden. Aber schön wäre es schon, wenn Falscheingaben trotzdem abgefangen würden. Deshalb habe ich die Funktion "plausi_check()" geschrieben, welche allerdings nicht funktionieren will. Da bekomme ich Syntaxfehler bei denen ich noch nicht verstehe warum. So wie die Funktion (ohne Auskommentierung) da steht ist es das "exit()" in dem "if"-Bereich. Kommentiere ich das aus ist es das "elif". Ich bin noch nicht dahintergestiegen was ich den nun schon wieder bei so einer einfachen Abfrage falsch gemacht habe, aber das kommt bestimmt noch.


    vg

    Thorsten


    Und hier das (vorläufige) Ergebnis: Besser so?

    Nachtrag: Zeile 14 entfernt und in Zeile 52 + 66 die doppelten Klammen rausgenommen.

    Also zeig es mal bitte!

    Muss als sudo ausgeführt werden sonst killt es nicht. Und wenn ich hier direkt ein sudo vor das kill setze funktioniert das zwar in der Konsole mit pi, aber der www-data darf es nicht.

    Boah und eben grad sehe ich das "basename" im Code. War das der Grund für die Fehlermeldung meiner Eingangsfrage? Würde mich jetzt schon interessieren: Muss ich beim verwenden einer main() Funktion zwangsweise eine Dateiendung haben oder hatte kam diese Basename-Meldung gar nicht von dem Python-Script sondern von sniper weil der Dateiname in SCRIPT nicht passte?

    :wallbash: Man, das Problem hatte ich schon mal mit sniper , war wohl so blockiert, dass ich es vergessen hatte. Die Lösung liegt darin auch für die neue sniper3 einen Eintrag mit sudo visudo zu erstellen: www-data ALL=NOPASSWD:/home/pi/wecker/sniper3.sh


    Als ich eben auf das Stichwort sudo visudo im Netz traf fiel es mir direkt wieder ein.

    Zeig mal die /home/pi/wecker/sniper.sh! Vielleicht gibt es dort einen Ansatzpunkt.

    Sorry Hyle, hab deinen Beitrag erst jetzt gesehen.

    Problem gelöst. Willst du sie noch sehen?


    Dennis89 Danke für die Vorlage. Was hälst du davon wie ich es umgesetzt habe, also so fürs erste? Jetzt hab ich die Logik hinter dieser main() Geschichte endlich geblickt.


    llutz Auch dir Danke, das Problem lag aber tatsächlich nur an der fehlenden Dateiendung.

    und was ist wenn du ./wecken3.py 99 nimmst?

    Vorhin hatte ich das script einfach nur mit .py Endung kopiert und das alte gelöscht.

    jetzt habe ich alles was eine "3" im Namen hat gelöscht, den Pi neugestartet, der Übersicht halber ein "test.py" im Ordner ~/wecker erstellt und ausführbar gemacht.

    Der Basename Fehler ist jetzt weg. Hat mir ja keine Ruhe gelassen und ich hatte weiter gegoogelt bis ich schließlich auf den debian-manpages was gefunden hatte. Jetzt hab ich verstanden warum du das mit der Endung vorgeschlagen hattest. Ich gehe also davon aus, dass beim Kopieren einer Datei auch irgendwelche "Zusätze" mit kopiert werden wie z. B. "ist ausführbar" und es deshalb bei der Fehlermeldung geblieben war.


    *Pause, rumfrickel*


    So, mein Script funktioniert soweit tatsächlich. Es heißt jetzt offiziell erstmal wieder "wecken3.py"

    Die Sniperdatei musste ich entsprechend angleichen. Ich hab jetzt erst mal eine sniper3.sh damit mir da nichts durcheinander kommt.

    Aus der Konsole klappt es soweit.


    Die php Seite entsprechend umgeschrieben, sie verweist jetzt auf beide "3er" Dateien.

    Weckzeit setzen mit der php Seite klappt.


    Löschen nicht. Die sniper3.sh wird definitiv gestartet wenn ich auf den Button klicke, aber sie löscht nicht. Das geht nur aus der Konsole heraus.


    Wenn ich alles wieder auf die alte wecken ohne Ziffer zurücksetze und die alte sniper.sh nehme funktioniert das Löschen. Allerdings nicht für Zeiten die mit wecken3.py erstellt wurden.

    grep -r wecken3 /home/pi/{schalten,wecken}/*

    wolltest du evtl. das hier?

    Code
    pi@schaltpi:~ $ ls  -r ~/
    wecker  schalten  afterboot.py
    pi@schaltpi:~ $ ls  -r ~/wecker
    weckzeit.txt  wecken3.py  wecken2  wecken  sniper.sh  README.txt  codesend
    pi@schaltpi:~ $ ls  -r ~/schalten
    winterled.py  sniffer  README  lichtwecker.sh  codesend

    grep -r wecken3 /home/pi/{schalten,wecken}/*

    Das Verzeichnis wiederum heisst wecker nicht wecken. ;) Ich habe es mit verschiedenen Schreibweisen je aus ~/wecker und ~/  heraus. Alles ohne Ausgabe:

    wecken3 != wecken, welches ist nun was bei dir?

    Nein ist es nicht

    "wecken" läuft ja eigentlich problemlos, soweit war ich ja schon. Dann wollte ich das alles so umschreiben, dass es mit einer main() Funktion läuft; das ist wecken3 bzw. jetzt wecken3.py.

    Die komplette Vorgeschichte von "wecken" findest du unter dem Link im ersten Beitrag hier.

    Ich hätte "wecken3(.py)" jetzt auch "testwecken" oder "Kurt-Friedrich.py" nennen können, aber Ziffern hinter dem Namen fand ich übersichtlicher. :lol:

    Was sagen

    ls -l ./wecken

    cat ./wecken

    readlink -f ./wecken

    "wecken" läuft ja eigentlich problemlos, soweit war ich ja schon. Dann wollte ich das alles so umschreiben, dass es mit einer main() Funktion läuft; das ist wecken3 bzw. jetzt wecken3.py. Ich geb dir hier mal die Ausgabe für "nur" wecken wie du es schreibst. Soll ich es auch für wecken3.py durchführen?

    Code
    pi@schaltpi:~/wecker $ ls -l ./wecken
    -rwxr-xr-x 1 pi pi 1049 Aug  9 09:34 ./wecken
    Code
    pi@schaltpi:~/wecker $ readlink -f ./wecken
    /home/pi/wecker/wecken

    und was ist wenn du ./wecken3.py 99 nimmst?

    Hallo Dennis,

    sehr interessant:

    cp wecken3 wecken3.py

    rm wecken3

    und dann ohne wecken3.py auch nur einmal angefasst zu haben

    ./wecken 99

    hat die Ausgabe:

    Code
    basename: extra operand ‘/home/pi/wecker/wecken3.py’
    Try 'basename --help' for more information.
    Usage: grep [OPTION]... PATTERNS [FILE]...
    Try 'grep --help' for more information.

    Man beachte das wecken3.py in der Ausgabe. Woher holt er sich das? Die *.py Datei wurde ja noch gar nicht ausgeführt sondern nur erstellt.


    ./wecken3.py erzeugt die gleiche Ausgabe wie das ohne .py Endung.


    Thorsten


    Nachtrag: Es scheint mit dem Starten (run) von sniper.sh zu tun zuhaben. Als ich dieses eben direkt gestartet habe gabs auch diese Meldung. Als ob meine main Funktion da was "verstellt" hat.


    Im Script kommt weder basename noch grep vor, in der Fehlermeldung aber schon?!

    Ich nehme mal an basename ist Teil der Fehlermeldung nicht des Scriptes und grep beschreibt wie basename zu benutzen ist. Da ich aber nicht weiß was ich als [OPTION]... PATTERNS [FILE] eintragen soll bringt mir das auch nichts.


    Die beiden letzten Zeilen der Ausgabe sind Printzeilen aus den Programmen. Können ignoriert werden.

    Hallo schon wieder,


    Vorgeschichte: Link zum Thread. Ich mache mal einen neuen auf, es ist zwar immer noch das gleiche Projekt, aber ein neues Script und andere Fehler/Fragen.

    Dennis89 hatte mir ja ein Beispiel geschrieben, wie ich mein Programm mit einer main() Funktion schreiben könnte. Das hab ich mir zum Vorbild genommen und es mal versucht. Stoße aber an meine Grenzen. Hier zuerst mal mein Code:

    Das Problem:

    Wenn ich ./wecken3 99 (wecken3 ist das Testprogramm, "nur" wecken das Produktivprogramm) eingebe bekomme ich:

    Code
    pi@schaltpi:~/wecker $ ./wecken3 99
    basename: extra operand ‘/home/pi/wecker/wecken3’
    Try 'basename --help' for more information.
    Usage: grep [OPTION]... PATTERNS [FILE]...
    Try 'grep --help' for more information.
    Script läuft gar nicht mehr
    Sniper wurde gestartet

    Zu diesem Fehler finde ich im Netzt leider keine, mir verständliche, Erklärung. Auch das basename --helphilft mir nicht weiter. Das "witzige" ist: Wenn ich danach das "normale" wecken mit 99 für löschen starte bekomme ich die gleiche Meldung, auch mit dem "wecken3" im Meldungstext. Selbst nach einem Neustart kommt das noch. Erst wenn ich das Script wecken3 lösche läuft wieder alles normal. Kann mir das bitte jemand verständlich und auf deutsch erklären? Ach ja, das sniper-script löscht den Eintrag auch nicht, es behauptet einfach da wäre keiner :conf:


    Als 2. musste ich die Definition für weckzeit in die Funktionen weckzeit_schreiben() und pruefen_und_wecken() direkt reinschreiben, wenn ich sie nur in der main Funktion stehen habe wird sie scheints nicht gefunden. Geht das auch anders?