Zeitgemäße Werkzeuge
Zu Befehl: date & cal
Up to date!
Der Superuser root darf mit date die Systemzeit stellen. Das Kommando erwartet dabei die Angabe der Zeit in der Form MMDDhhmmCCYY.ss ohne vorangestelltes Pluszeichen +, z. B.:
asteroid:~# date 04111723 Fre Apr 11 17:23:00 CEST 2003
Gesetzt werden dürfen:
- MM: Monat, z. B. 04
- DD: Tag, z. B. 13
- hh: Stunde, z. B. 12
- mm: Minute, z. B. 59
- CC: die ersten beiden Stellen der Jahreszahl (optional), z. B. 19
- YY: die letzten beiden Stellen der Jahreszahl (optional), z. B. 73
- ss: die Sekunden (optional), z. B. 24
Mit der Zusatzoption -s darf beim Setzen der Zeit auch eine etwas freiere Notation verwendet werden, z. B. date -s 04/29/2003:
asteroid:~# date -s 04/29/2003 Die Apr 29 00:00:00 CEST 2003 asteroid:~# date -s "04/29/2003 15:58" Die Apr 29 15:58:00 CEST 2003
Beachten Sie, dass eine Änderung der Systemzeit nicht die CMOS-Uhr beeinflusst. Um diese an die aktuelle Systemzeit anzupassen, verwenden Sie (ebenfalls als Superuser root) den Befehl hwclock -w (oder in der Langform hwclock --systohc, diese Option steht für "system to hardware clock").
Happy Birthday to you!
Seine große Stärke zeigt das Kommando date in Shell-Skripten. Im Geburtstagskalender (siehe Listing 1) zeigen wir, wie Sie cal und date schön kombinieren können. Ausgangspunkt ist eine versteckte Datei im eigenen Home-Verzeichnis (~/.birthdays). Pro Zeile gibt es dort ein Datum und einen Namen:
huhn@asteroid:~$ cat .birthdays 28.02. Petronella 28.04. Jones 27.04. Easter …
Im Skript birthday.sh wird zunächst die Variable heute_cal mit der Ausgabe von date +%e belegt (vergleiche Tabelle 1). Das folgende echo -e erlaubt die Verwendung von Escape-Sequenzen. Dazu gehören auch \n für einen Zeilenumbruch und \t für einen Tabulator. Das Kommando cal gibt den Kalender aus, wobei die Ausgabe in diesem Fall durch das Pipe-Zeichen "|" an den sed-Aufruf weitergeleitet wird. sed sucht jetzt in diesem Kalenderblatt den Abschnitt, der den Tag (die Ausgabe von date +%e) enthält und an einem Wortende (>, das ist der Regex-Ausdruck dafür) liegt. Er wird ersetzt durch ESC[31;7m (eine ANSI-Escape-Sequenz, die das Terminal auf rot und inverse Darstellung umschaltet), den Abschnitt selbst (&, das ist die sed-Referenz auf den ersetzten String) und ESC[39;0m (eine zweite Sequenz, die die Terminaldarstellung wieder zurücksetzt). Die zahllosen Backslashes sind nötig, um die Ausdrücke für die Shell und für sed passend zu maskieren.
Anschließend wird die Ausgabe von date +%d.%m der Variablen heute zugewiesen. Zunächst gibt das Skript das heutige Datum aus, dann schaltet es das Terminal auf rot um (ANSI-Sequenz). In der Datei ~/.birthdays sucht grep nach Zeilen, die mit dem Tagesdatum beginnen ("^$heute"). Zum Schluss wird das Terminal wieder auf normale Schriftfarbe zurückgestellt.
Die letzte Zeile des Skripts lässt sich in etwa so aufschlüsseln: Das Programm egrep (eine Variante von grep, die reguläre Ausdrücke beherrscht) sucht in ~/.birthdays nach Zeilen, die mit einer beliebigen Anzahl Ziffern (0 bis 9) beginnen, danach einen Punkt, den aktuellen Monat und wieder einen Punkt enthalten. Dabei bedeutet das "^"-Zeichen "am Zeilenanfang" und "[0-9]*" steht für beliebig viele Zeichen aus dem Bereich von 0 bis 9.
Ein Eintrag der Form
. ~/birthday.sh
in die Datei .profile sorgt dafür, dass das Skript bei jedem Login ausgeführt wird – so behalten Sie die wichtigen Daten immer im Auge.
Listing 1
Das Geburtstags-Skript
#!/bin/sh
heute_cal=`date +%e`
echo -e "`cal | sed s/"${heute_cal}\>"/\\\\\\\\e[31\;7m\&\\\\\\\\e[39\;0m/g`"
echo
heute=`date +%d.%m`
echo Heute ist der $heute, Geburtstag\(e\):
echo -e "\033[31m"; grep "^$heute" ~/.birthdays; echo -e "\033[0m"
morgen=`date -d tomorrow +%d.%m`
echo Morgen ist der $morgen, Geburtstag\(e\):
grep "^$morgen" ~/.birthdays
echo
dieser_Monat=`date +%m`
echo Im `date +%B` haben folgende Leute Geburtstag:
egrep "^[0-9]*\.$dieser_Monat\." ~/.birthdays
Glossar
Locales
Linux unterstützt verschiedene Ausgabesprachen für Programm- und Systemmeldungen, Datums- oder Währungsangaben. Die Namen aller auf Ihrem System installierten Lokalisierungen (engl.: locales) nennt Ihnen das "locale"-Kommando: "locale -a".
CMOS
Complimentary Metal-Oxide Semiconductor. Der Timer-Chip, der die Systemzeit misst, läuft nicht weiter, wenn der Rechner ausgeschaltet ist. Alle PCs haben daher eine Batterie-betriebene Uhr, die das Datum und die Uhrzeit auch dann weiterzählt, wenn der Rechner ohne Stromversorgung ist. Da diese Uhr im gleichen Baustein wie das CMOS-RAM untergebracht ist, nennt man sie auch CMOS-Uhr. Andere gängige Bezeichnungen sind: Hardware-Uhr, RTC (Real Time Clock) oder BIOS-Uhr.



