Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 5 Terminal-Ein- und Ausgabe
  gp 5.1 Von Terminals zu Pseudo-Terminals
  gp 5.2 Ausgabe
    gp 5.2.1 Der echo-Befehl
    gp 5.2.2 print (Korn-Shell only)
    gp 5.2.3 Der Befehl printf
    gp 5.2.4 Der Befehl tput – Terminalsteuerung
  gp 5.3 Eingabe
    gp 5.3.1 Der Befehl read
    gp 5.3.2 (Zeilenweise) Lesen einer Datei mit read
    gp 5.3.3 Zeilenweise mit einer Pipe aus einem Kommando lesen (read)
    gp 5.3.4 Here-Dokumente (Inline-Eingabeumleitung)
    gp 5.3.5 Here-Dokumente mit read verwenden
    gp 5.3.6 Die Variable IFS
    gp 5.3.7 Arrays einlesen mit read (Bash und Korn-Shell only)
    gp 5.3.8 Shell-abhängige Anmerkungen zu read
    gp 5.3.9 Einzelnes Zeichen abfragen
    gp 5.3.10 Einzelne Zeichen mit Escape-Sequenzen abfragen
    gp 5.3.11 Passworteingabe
  gp 5.4 Umlenken mit dem Befehl exec
  gp 5.5 Filedeskriptoren
    gp 5.5.1 Einen neuen Filedeskriptor verwenden
    gp 5.5.2 Die Umlenkung <>
  gp 5.6 Named Pipes
  gp 5.7 Menüs mit select (Bash und Korn-Shell only)
  gp 5.8 dialog und Xdialog
    gp 5.8.1 Entscheidungsfrage --yesno
    gp 5.8.2 Nachrichtenbox mit Bestätigung --msgbox
    gp 5.8.3 Hinweisfenster ohne Bestätigung --infobox
    gp 5.8.4 Text-Eingabezeile --inputbox
    gp 5.8.5 Ein einfacher Dateibetrachter --textbox
    gp 5.8.6 Ein Menü --menu
    gp 5.8.7 Auswahlliste zum Ankreuzen --checklist
    gp 5.8.8 Radiobuttons zum Auswählen --radiolist
    gp 5.8.9 Fortschrittszustand anzeigen --gauge
    gp 5.8.10 Verändern von Aussehen und Ausgabe
    gp 5.8.11 Kleines Beispiel
    gp 5.8.12 Zusammenfassung
  gp 5.9 gnuplot – Visualisierung von Messdaten
    gp 5.9.1 Wozu wird gnuplot eingesetzt?
    gp 5.9.2 gnuplot starten
    gp 5.9.3 Das Kommando zum Plotten
    gp 5.9.4 Variablen und Parameter für gnuplot
    gp 5.9.5 Ausgabe von gnuplot umleiten
    gp 5.9.6 Variablen und eigene Funktionen definieren
    gp 5.9.7 Interpretation von Daten aus einer Datei
    gp 5.9.8 Alles bitte nochmals zeichnen (oder besser speichern und laden)
    gp 5.9.9 gnuplot aus einem Shellscript heraus starten (der Batch-Betrieb)
    gp 5.9.10 Plot-Styles und andere Ausgaben festlegen
    gp 5.9.11 Tricks für die Achsen
    gp 5.9.12 Die dritte Dimension
    gp 5.9.13 Zusammenfassung


Rheinwerk Computing

5.8 dialog und Xdialodowntop

Mit dialog und Xdialog können Sie grafische (bzw. semigrafische) Dialoge in Ihre Shellscripts mit einbauen. Die Tools dienen zur einfachen Darstellung (halb-)grafischer Dialogfenster auf dem Bildschirm, sodass Sie Benutzerabfragen in Scripts anschaulicher und einfacher gestalten können. Die Rückgabewerte der Dialoge entscheiden dann über den weiteren Verlauf des Shellscripts.

Die Tools funktionieren im Prinzip ähnlich wie die üblichen Linux-UNIX-Kommandos und werden mit Kommandozeilenparameter und Standardeingabe zur Beeinflussung von Aussehen und Inhalten gesteuert. Die Resultate (auch Fehler) der Benutzeraktionen werden über die Standardausgabe bzw. die Standardfehlerausgabe und den Exit-Status des Scripts zurückgegeben und können von demjenigen Script, von dem der Dialog gestartet wurde, weiterverarbeitet werden.

dialog läuft ausschließlich in einer Textkonsole und stellt eine Art halbgrafische Oberfläche (basierend auf ncurses) zur Verfügung. Dass dialog keine echte grafische Oberfläche besitzt (bzw. keinen laufenden X-Server benötigt) und somit recht anspruchslos ist, macht es zu einem komfortablen Tool zur Fernwartung über SSH. Die Steuerung von dialog erfolgt über die Tastatur, jedoch ist auch Maussteuerung möglich. Gewöhnlich liegt dialog Ihrer Distribution bei und wird eventuell auch schon über eine Standardinstallation mitinstalliert.

Xdialog läuft im Gegensatz zu dialog nur, wenn ein laufender X-Server zur Verfügung steht. Da dies bei Fernwartungen selten der Fall ist, eignet sich Xdialog eher für Shellscripts und Wartungsarbeiten auf dem heimischen Desktoprechner. Xdialog verwendet als Toolkit GTK+ und muss meistens noch separat bezogen werden (hierbei muss auch gtk-devel größer als 1.2 installiert sein). Natürlich lässt sich Xdialog GUI-üblich mit der Maus steuern.


Hinweis   Sofern Sie eines (oder beide) der Pakete nicht auf Ihrem Rechner vorfinden, sei hier die Bezugsquelle der jeweiligen Tools genannt: http://hightek.org/dialog/ (dialog) und http://xdialog.dyns.net/ (Xdialog). Vermutlich werden Sie allerdings den Quellcode selbst übersetzen müssen (ggf. INSTALL lesen).


Das Tolle an dialog und Xdialog ist, dass beim Entwickeln von Xdialog auf Kompatibilität geachtet wurde. Sie können die mit dialog erstellten Scripts mit einem minimalen Aufwand in eine absolute grafische Oberfläche mit Xdialog umwandeln. Hierzu müssen Sie nur den Kommandoaufruf dialog in Xdialog umändern. Wobei erwähnt werden muss, dass Xdialog noch ein paar Features mehr anbietet als dialog.

Die allgemeine Syntax zu dialog bzw. Xdialog sieht wie folgt aus:

[X]dialog [optionen] [Art des Feldes] "Text" [breite] [höhe]

Rheinwerk Computing

5.8.1 Entscheidungsfrage --yesno  downtop

Mit ––yesno können Sie eine Entscheidungsfrage stellen, die mit »ja« oder »nein« bestätigt wird. Gibt der Benutzer »ja« ein, gibt dialog den Wert 0 zurück ($? = 0), ansonsten wird bei »nein« 1 zurückgegeben. Die Syntax:

dialog --yesno [Text] [Höhe] [Breite]

Ein Beispielscript:

# Demonstriert dialog --yesno
# Name : dialog1
dialog --yesno "Möchten Sie wirklich abbrechen?" 0 0
# 0=ja; 1=nein
antwort=$?
# Bildschirm löschen
clear
# Ausgabe auf die Konsole
if [ $antwort = 0 ]
then
   echo "Die Antwort war JA."
else
   echo "Die Antwort war NEIN."
fi

Das Script bei der Ausführung (siehe Abbildung 5.3):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.3   Dialog --yesno in der Praxis


Nun wollen Sie sicherlich testen, ob die Ausführungen zu dialog und Xdialog stimmen und man tatsächlich nur ein (großes) »X« vor dialog stellen muss, um eine echte grafische Oberfläche zu erhalten. Ändern Sie die Zeile

dialog --yesno "Möchten Sie wirklich abbrechen?" 0 0

im Script »dialog1« um in

Xdialog --yesno "Möchten Sie wirklich abbrechen?" 0 0

und Sie erhalten folgendes, in Abbildung 5.4 gezeigtes Ergebnis (immer vorausgesetzt, Sie haben Xdialog installiert):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.4   Dialog --yesno mit Xdialog



Hinweis   Wird bei der Höhe oder Breite 0 angegeben, so werden die entsprechenden Maße automatisch an den Text angepasst.



Rheinwerk Computing

5.8.2 Nachrichtenbox mit Bestätigung --msgbox  downtop

Mit ––msgbox erscheint eine Informationsbox mit beliebigem Text, den der Benutzer mit »OK« bestätigen muss. Die Abarbeitung des Scripts wird so lange angehalten, bis der Benutzer den OK-Button drückt. Hierbei wird kein Rückgabewert zurückgegeben.

[X]dialog --msgbox [Text] [Höhe] [Breite]

Ein Beispielscript:

# Demonstriert dialog --msgbox
# Name : dialog2
dialog --yesno "Möchten Sie wirklich abbrechen?" 0 0
# 0=ja; 1=nein
antwort=$?
# Dialog-Bildschirm löschen
dialog --clear
# Ausgabe auf die Konsole
if [ $antwort = 0 ]
then
   dialog --msgbox "Die Antwort war JA." 5 40
else
   dialog --msgbox "Die Antwort war NEIN." 5 40
fi
# Bildschirm löschen
clear

Das Script bei der Ausführung (siehe Abbildung 5.5):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.5   Dialog --msgbox in der Praxis



Rheinwerk Computing

5.8.3 Hinweisfenster ohne Bestätigung --infobox  downtop

––infobox ist gleichwertig zum eben erwähnten Dialog ––msgbox, nur mit dem Unterschied, dass dieser Dialog nicht auf die Bestätigung des Benutzers wartet und somit das Shellscript im Hintergrund weiter ausgeführt wird.

[X]dialog --infobox [Text] [Höhe] [Breite]

Ein Script als Demonstration:

# Demonstriert dialog --msgbox
# Name : dialog3
dialog --yesno "Möchten Sie wirklich alles löschen?" 0 0
# 0=ja; 1=nein
antwort=$?
# Dialog-Bildschirm löschen
dialog --clear
# Ausgabe auf die Konsole
if [ $antwort = 0 ]
then
   dialog --infobox "Dieser Vorgang kann ein wenig dauern" 5 50
   # Hier die Kommandos zur Ausführung zum Löschen
   sleep 5           # ... wir warten einfach 5 Sekunden
   dialog --clear    # Dialog-Bildschirm löschen
   dialog --msgbox "Done! Alle Löschvorgänge ausgeführt" 5 50
fi
# Bildschirm löschen
clear

Rheinwerk Computing

5.8.4 Text-Eingabezeile --inputbox  downtop

In einer Text-Eingabezeile mit ––inputbox können Eingaben des Benutzers erfolgen. Optional kann man hier auch einen Text vorbelegen. Die Ausgabe erfolgt anschließend auf die Standardfehlerausgabe.

[X]dialog --inputbox [Text] [Höhe] [Breite] [[Vorgabetext]]

Ein Script zu Demonstrationszwecken:

# Demonstriert dialog --inputbox
# Name : dialog4
name=`dialog --inputbox "Wie heißen Sie?" 0 0 "Jürgen" \
 3>&1 1>&2 2>&3`
# Dialog-Bildschirm löschen
dialog --clear
dialog --msgbox "Hallo $name, Willkommen bei $HOST!" 5 50
# Bildschirm löschen
clear

Das Script bei der Ausführung (siehe Abbildung 5.6):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.6   Dialog --inputbox in der Praxis


Vielleicht wundern Sie sich im Script bei der Verarbeitung des Dialog-Kommandos über den Zusatz 3>&1 1>&2 2>&3 in der Kommando-Substitution. Dies ist einer der Nachteile von dialog, weil hierbei das Ergebnis immer auf die Standardfehlerausgabe statt auf die Standardausgabe erfolgt. Und um die Dialogausgabe zur weiteren Verarbeitung in eine Variable zu schreiben, müssen Sie ebenso vorgehen (siehe auch Abschnitt 5.5).


Rheinwerk Computing

5.8.5 Ein einfacher Dateibetrachter --textbox  downtop

Mit diesem Dialog kann der Inhalt einer als Parameter übergebenen Datei angezeigt werden. Enthält der Text mehr Zeilen oder Spalten als angezeigt werden können, kann der darzustellende Text mit den Pfeiltasten ((?) (?) (?) (?)) gescrollt werden.

[X]dialog --textbox [Datei] [Höhe] [Breite]

Ein Script zur Demonstration:

# Demonstriert dialog --textbox
# Name : dialog5
# Zeigt den Inhalt des eigenen Quelltextes an
dialog --textbox "$0" 0 0
# Dialog-Bildschirm löschen
dialog --clear
# Bildschirm löschen
clear

Das Script bei der Ausführung (siehe Abbildung 5.7):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.7   Dialog --textbox in der Praxis



Rheinwerk Computing

5.8.6 Ein Menü --menu  downtop

Mit diesem Dialog verfügen Sie über eine echte Alternative zu select. Hierbei wird eine Liste von Einträgen (ggf. mit Scrollbalken) angezeigt, von denen jeweils einer ausgewählt werden kann. Der entsprechende Eintrag (dessen Kürzel) wird dann auf den Standardfehlerkanal zurückgegeben, ansonsten – bei Abbruch – eine leere Zeichenkette.

[X]dialog --menu [Text] [Höhe] [Breite] [Menühöhe] [Tag1] \
[Eintrag1] ...

Der »Text« wird oberhalb der Auswahlbox gesetzt. »Breite« und »Höhe« sprechen für sich, wobei die »Breite« ein etwas genaueres Augenmerk verlangt, da längere Menüeinträge einfach abgeschnitten werden. Haben Sie eine Auswahl getroffen, wird durch Betätigen von »OK« der selektierte Eintrag zurückgegeben.

Ein Script zur Demonstration:

# Demonstriert dialog --menu
# Name : dialog6
os=`dialog --menu "Betriebssystem wählen" 0 0 0 \
 "Linux" "" "BSD" "" "Solaris" "" 3>&1 1>&2 2>&3`
dialog --clear
dialog --yesno "Bestätigen Sie Ihre Auswahl: $os" 0 0
dialog --clear
clear

Das Script bei der Ausführung (siehe Abbildung 5.8):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.8   Dialog --menu in der Praxis



Rheinwerk Computing

5.8.7 Auswahlliste zum Ankreuzen --checklist  downtop

Hierbei handelt es sich um eine Liste von Einträgen, von denen Sie beliebig viele markieren (ankreuzen) können. Es werden – wie schon bei –menu – die Kürzel aller ausgewählten Einträge auf den Standardfehlerkanal zurückgegeben.

[X]dialog --checklist [Text] [Höhe] [Breite] [Listenhöhe] \
[Tag1] [Eintrag1] [Status1] ...

Auch hier wird der »Text« wieder oberhalb der Auswahlliste ausgegeben. Die »Höhe«, »Breite« und »Listenhöhe« sind eigentlich wieder selbsterklärend. Bei ihnen sollte man stets auf ein vernünftiges Maß achten. Wenn das erste Zeichen der Tags eindeutig ist, kann auch mit einem Tastendruck des entsprechenden Zeichens direkt dorthin gesprungen werden. Als »Status« können Sie den Eintrag als markiert »on« oder als deaktiviert »off« voreinstellen.

Das folgende Script soll Ihnen die Auswahlliste demonstrieren:

# Demonstriert dialog --checklist
# Name : dialog7
pizza=`dialog --checklist "Pizza mit ..." 0 0 4 \
 Käse "" on\
 Salami "" off\
 Schinken "" off\
 Thunfisch "" off 3>&1 1>&2 2>&3`
dialog --clear
clear
echo "Ihre Bestellung: Pizza mit $pizza"

Das Script bei der Ausführung (siehe Abbildung 5.9):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.9   Dialog --checklist in der Praxis



Rheinwerk Computing

5.8.8 Radiobuttons zum Auswählen --radiolist  downtop

Im Unterschied zu ––checklist kann hier aus einer Liste von Einträgen nur eine Option mit der Leertaste markiert werden. Ansonsten entspricht dieser Dialog exakt dem von ––checklist.

[X]dialog --radiolist [Text] [Höhe] [Breite] [Listenhöhe] \
[Tag1] [Eintrag1] [Status1] ...

Ein Script zur Demonstration:

# Demonstriert dialog --radiolist
# Name : dialog8
pizza=`dialog --radiolist "Pizza mit ..." 0 0 3 \
  Salami "" off\
  Schinken "" off\
  Thunfisch "" off 3>&1 1>&2 2>&3`
dialog --clear
clear
echo "Ihre Bestellung: Pizza mit $pizza"

Das Script bei der Ausführung (siehe Abbildung 5.10):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.10   Dialog --radiolist in der Praxis



Rheinwerk Computing

5.8.9 Fortschrittszustand anzeigen --gauge  downtop

Hiermit können Sie einen Fortschrittszustand einbauen, um etwa anzuzeigen, wie weit der Prozess des Kopierens von Dateien schon abgeschlossen ist.

[X]dialog --gauge [Text] [Höhe] [Breite] [Prozent]

Der Text wird wieder oberhalb des Fortschrittsbalkens angezeigt. Der Startwert des Balkens wird über Prozent angegeben. Um die Anzeige zu aktualisieren, erwartet dieser Dialog weitere Werte aus der Standardeingabe. Erst wenn hierbei auf EOF gestoßen wurde, ist gauge fertig. Der Fortschrittszustand ist meiner Meinung nach ohnehin nie etwas Genaues, sondern dient wohl eher dazu, dem Anwender zu zeigen, dass auf dem System noch etwas passiert. ;-)

Ein Script zur Demonstration:

# Demonstriert dialog --gauge
# Name : dialog9
DIALOG=dialog
(
 echo "10" ; sleep 1
 echo "XXX" ; echo "Alle Daten werden gesichert"; echo "XXX"
 echo "20" ; sleep 1
 echo "50" ; sleep 1
 echo "XXX" ; echo "Alle Daten werden archiviert"; echo "XXX"
 echo "75" ; sleep 1
 echo "XXX" ; echo "Daten werden ins Webverzeichnis hochgeladen";
 echo "XXX"
 echo "100" ; sleep 3
) |
$DIALOG --title "Fortschrittszustand" --gauge "Starte Backup-Script" 8 30
$DIALOG --clear
$DIALOG --msgbox "Arbeit erfolgreich beendet ..." 0 0
$DIALOG --clear
clear

Das Script bei der Ausführung (siehe Abbildung 5.11):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.11   Dialog --gauge in der Praxis



Tipp   Beim letzten Script ist mir erst eingefallen, dass es recht umständlich ist, dialog immer in Xdialog umzubenennen. Eine globale Variable eignet sich viel besser. Soll Ihr Script für die Konsole sein, dann schreiben Sie DIALOG=dialog, für einen Dialog mit dem X-Server DIALOG=Xdialog.

Hinweis   Für Scripts, die als root ausgeführt werden, sollte man möglichst kein Xdialog verwenden, da sich root nur mit dem X-Server verbinden kann, wenn der Server freigegeben wurde oder root grafisch eingeloggt ist, was man beides vermeiden sollte.



Rheinwerk Computing

5.8.10 Verändern von Aussehen und Ausgabe  downtop

Es gibt noch ein paar Dialoge, mit denen Sie das Aussehen und die Ausgabe beeinflussen können. Tabelle 5.10 bietet eine kurze Übersicht.


Tabelle 5.10   Weitere Dialoge

Option Erläuterung
––title Eine Titelzeile für einen Dialog festlegen (Beschriftung für den oberen Rand)
––backtitle Eine Titelzeile am Bildschirmrand festlegen (hierbei wird häufig der Scriptname verwendet, der zum jeweiligen Dialog gehört)
––clear Dialog-Bildschirm löschen


Rheinwerk Computing

5.8.11 Kleines Beispiel  downtop

dialog und Xdialog lassen sich sehr vielseitig und eigentlich überall verwenden, sodass ein Beispiel immer recht wenig Sinn ergibt. Trotzdem will ich Ihnen ein kleines Beispiel zeigen. Es soll der Befehl find verwendet werden, und zwar so, dass auch der unbedarfte Linux-UNIX-User sofort an sein Ziel kommt. Im Beispiel wird ein Menü verwendet, wobei der User Dateien nach Namen, User-Kennung, Größe oder Zugriffsrechten suchen kann. In der anschließenden Eingabebox können Sie das Suchmuster festlegen und am Ende wird find aktiv. Zwar könnte man die Ausgabe von find auch in eine Textbox von dialog packen, aber bei einer etwas längeren Ausgabe macht die Dialogbox schlapp und gibt einen Fehler aus wie: »Die Argumentliste ist zu lang«. Hier das Beispielscript:

# Demonstriert dialog
# Name : dialog10
myfind=`dialog --menu \
 "Suchen nach Dateien – Suchkriterium auswählen" 0 0 0 \
 "Dateinamen" "" \
 "Benutzerkennung" "" \
 "Grösse" "" \
 "Zugriffsrechte" "" \
 "Ende" "" 3>&1 1>&2 2>&3`
dialog --clear
case "$myfind" in
   Dateinamen)
      search=`dialog --inputbox \
         "Dateinamen eingeben" 0 0 "" 3>&1 1>&2 2>&3`
      command="-name $search"   ;;
   Benutzerkennung)
      kennung=`dialog --inputbox \
         "Benutzerkennung eingeben" 0 0 "" 3>&1 1>&2 2>&3`
      command="-user $kennung"   ;;
   Grösse)
      bsize=`dialog --inputbox \
         "Dateigrösse (in block size) eingeben" 0 0 "" \
         3>&1 1>&2 2>&3`
      command="-size $bsize"   ;;
   Zugriffsrechte)
      permission=`dialog --inputbox \
         "Zugriffsrechte (oktal) eingeben" 0 0 "" 3>&1 1>&2 2>&3`
      command="-perm $permission"   ;;
   Ende) dialog --clear; clear; exit 0    ;;
esac
find /home $command -print 2>/dev/null

Das Script bei der Ausführung (siehe Abbildung 5.12):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 5.12   Ein kleines Beispiel zum Abschnitt dialog



Rheinwerk Computing

5.8.12 Zusammenfassung  toptop

Sicherlich ließe sich zu dialog und insbesondere Xdialog noch einiges mehr sagen, aber die Basis haben Sie gelegt. Xdialog bietet Ihnen natürlich noch einige Widgets mehr an. Wenn Sie sich das Quellcode-Paket herunterladen, finden Sie im Verzeichnis samples eine Menge interessanter Scripts, die Ihnen zusätzliche Funktionen von Xdialog demonstrieren.

Eine weitere, sehr verbreitete Dialog-Schnittstelle ist lxdialog. Sie ist eine modifizierte Version von dialog und speziell für die Konfiguration des Kernels ausgelegt. lxdialog wird also vorwiegend von Kernel-Entwicklern eingesetzt und unterstützt im Gegensatz zu dialog auch Untermenüs und Abhängigkeiten zwischen Inhalten und einer Vorauswahl anderer Punkte. Leider ist lxdialog sehr schlecht dokumentiert, sodass schon viel Motivation dazugehört, sich damit auseinander zu setzen.



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern