Hallo,
ich möchte auch mal eines meiner Projekte vorstellen. Es ist ein kleines Script für Erinnerungen.
Erstmal zum Grund und den Zielsetzungen: Normaler Weise benutze ich reminderfox für meine Erinnerungen. Bei kurzen und einmaligen Sachen ist das aber nicht optimal, weil es eher umständlich zu starten ist und nach dem Schließen des Browsers nicht mehr funktioniert. Eine Tilda läuft aber immer, also lag es nahe ein Shellscript für diese Aufgabe zu schrieben. Man soll mit einem einfachen Befehl die Erinnerung in Auftrag geben können und das ganze soll möglichst auch noch funktionieren, wenn der Rechner zwischenzeitlich neu gestartet wurde. Erinnert werden möchte ich akustisch und mit einer optischen Meldung.
Das folgende Script erledigt das jetzt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #!/bin/dash # reminder.sh, ein kleines Script, welches nach vorgegebener Zeit ein akustisches Signal und eine Meldung ausgibt # Copyright (C) 2011 Felix Kästner, reminder.sh @ f p u n k t k . de # This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # You should have received a copy of the GNU General Public License along with this program; if not, see http://www.gnu.org/licenses/. if [ ! -x /usr/bin/kdialog -o ! -x /usr/bin/aplay -o ! -x /usr/bin/xmessage -o ! -x /usr/bin/file ] then echo "kdialog, xmessage, file und aplay müssen installiert sein" exit 1 fi [ ! -x /usr/bin/iconv ] && echo "es ist günstig, wenn iconv installiert ist" defaultwavefile="/pfad/zu/default.wav" if [ ! -f "$defaultwavefile" ] then echo "keine gültige standard-wave-datei hinterlegt" exit 1 fi reminderausgabe() { /usr/bin/kdialog --nograb --title reminder --msgbox "$1" & # nograb scheint nicht zu funktionieren if [ -x /usr/bin/iconv ] then /usr/bin/xmessage "$(echo "$1" | /usr/bin/iconv -f utf-8 -t iso-8859-1)" & else /usr/bin/xmessage "$(echo "$1")" & fi /usr/bin/aplay -q "$2" & } if [ "$1" = "--at" ] then # Aufruf durch at, alle Befehle im Hintergrund ausführen { /bin/sleep $2; reminderausgabe "$3" "$4"; } & exit elif [ $# -ge 1 ] then reminput="$1" shift # eingaben der form [0-9]{1,3}[smh]+ passend für date umwandeln case $reminput in [0-9]|[0-9][0-9]|[0-9][0-9][0-9]) reminput="${reminput}sec" ;; [0-9]s|[0-9][0-9]s|[0-9][0-9][0-9]s) reminput="${reminput}ec" ;; [0-9]m|[0-9][0-9]m|[0-9][0-9][0-9]m) reminput="${reminput}in" ;; [0-9]h|[0-9][0-9]h|[0-9][0-9][0-9]h) reminput="${reminput}ours" ;; esac tnow=$(/bin/date +%s) # Zeit jetzt in Sekunden seit 1970 trem=$(/bin/date -d "$reminput" +%s) # Zeit für Erinnerung in Sekunden seit 1970 tremreadable=$(/bin/date -d "$reminput" '+am %A, dem %d.%m.%Y um %H:%M:%S') # lesbare Zeit für Erinnerung zur Ausagebe bei der Überprüfung tremreadablemsg=$(/bin/date -d "$reminput" '+%Y-%m-%d-%H:%M:%S') # lesbare Zeit für die Erinnerungsmeldung tremat=$(/bin/date -d "$reminput" +%Y%m%d%H%M) # Zeit für at trematsec=$(/bin/date -d "$reminput" +%S) # Sekunden für verzögerten Aufruf mit at remindersleeptime=$(($trem - $tnow)) if [ $remindersleeptime -le 0 ] # bei negativer remindersleeptime abbrechen then echo "abbruch da remindersleeptime = $remindersleeptime" exit 1 fi # überprüfen, ob eine gültige wave-Datei übergeben wurde if [ -f "$1" -a "$(/usr/bin/file -ib "$1")" = "audio/x-wav" ] then wavefile="$1" shift else wavefile="$defaultwavefile" fi remindermsg="${*:-reminder}" # Erinnerungsnachricht, default ist "reminder" echo -n "in $(($remindersleeptime / 60)) minuten $tremreadable wird \"$remindermsg\" ausgegeben. " # zur Überprüfung wird ausgegeben, was gemacht wird remindermsg="reminder $tremreadablemsg:\n\n$remindermsg" # noch die Zeit mit in die Erinnerungsnachricht aufnehmen if [ $remindersleeptime -ge 1000 ] # wenn es bis zur Erinnerung noch lange dauert, dann wird nachgefragt, ob alles richtig ist. then echo "Wenn das falsch ist, dann mit Strg + c abbrechen, sonst mit Enter fortfahren." read input else echo fi if [ $remindersleeptime -le 300 ] # wenn es bis zur Erinnerung nicht lange dauert, dann wird sleep benutzt, ansonsten at, für die ersten zwei Minuten ist sleep vermutlich die bessere Wahl then # alle Befehle im Hintergrund ausführen { /bin/sleep $remindersleeptime; reminderausgabe "$remindermsg" "$wavefile"; } & else # at wird benutzt echo "DISPLAY=$DISPLAY $0 --at $trematsec \"$remindermsg\" \"$wavefile\"" | /usr/bin/at -t "$tremat" 2> /dev/null fi else echo "Benutzung: $0 Zeitdauer|Zeitpunkt [auszugebende wave-Datei] [auszugebende Nachricht]" fi |
Was man anpassen kann:
man muss nicht kdialog und xmessage benutzen, eins von beidem oder etwas ganz anderes sollte auch gut sein (bei mir hat einmal die Ausgabe mit kdialog nicht funktioniert, also benutze ich jetzt erstmal beides, der Befehl für xmessage ist so gemacht, dass neue Zeilen mit
\n
und Umlaute in UTF-8 verstanden werden)aplay kann man auch durch beep ersetzen, eventuell hat auch das message-Programm etwas für die Tonausgabe eingebaut
die Abfragen mit
remindersleeptime
können angepasst werden
Was man verbessern kann:
einige Optionen stehen hart im Script, die könnten noch als Variablen an den Anfang, da sie aber nur einmal auftauchen finde ich das nicht so schlimm
Hinweise:
at versteht nur Zeitangaben mit vollen Minuten, daher werden die Sekunden extra übergeben und es wird dann mit sleep so lange gewartet
at sorgt im übrigen auch dafür, dass sich der Rechner nach einem Neustart an die Aufgaben erinnert
da ich sparsam bin nutze ich Dash statt Bash 😉 nur
#/bin/sh
sollte auch funktionieren
Welche Zeitangaben werden verstanden?
so gut wie alle 😉 also alles, was sleep und die case-Anweisung verstehen
Angaben zur Zeitdauer wie 10 oder 10s oder 10sec für 10 Sekunden, 7m oder 7min für 7 Minuten, h oder hours für Stunden (die Versionen mit einem oder keinem Buchstaben werden durch die case-Anweisung ermöglicht), die Langversionen kann man verbinden: 1hours10min oder "1hours 10min" (in Anführungszeichen, damit es in einer Variablen steht)
Angaben zum Zeitpunkt: 13:37 oder 12:34:56 oder "YYYY-MM-DD HH:MM" oder "tomorrow 11:00"
Teile des Scriptes habe ich schon im Forum und im zugehörigen Wikiartikel unter gebracht.
Über Meinungen und Verbesserungsvorschläge freue ich mich. Über Lob natürlich auch 😉