Inhaltsverzeichnis
Zusammenfassung
Heutzutage werden zunehmend Computer mit einer grafischen Benutzeroberfläche (GUI) wie KDE oder GNOME verwendet. Diese bieten zwar viele Funktionen, jedoch ist ihre Verwendung beschränkt, was automatische Aufgaben angeht. Shells sind eine gute Ergänzung für GUIs, und dieses Kapitel gibt Ihnen einen Überblick über einige Aspekte von Shells, in diesem Fall die Bash-Shell.
Traditionell handelt es sich bei der Shell um Bash (Bourne again Shell). Wenn in diesem Kapitel die Rede von "der Shell" ist, ist die Bash-Shell gemeint. Außer Bash sind noch weitere Shells verfügbar (ash, csh, ksh, zsh, …), von denen jede unterschiedliche Funktionen und Merkmale aufweist. Wenn Sie weitere Informationen über andere Shells wünschen, suchen Sie in YaST nach shell.
Eine Shell lässt sich aufrufen als:
interaktive Login-Shell. Diese wird zum Anmelden bei einem Computer durch den Aufruf von Bash mit der Option --login
verwendet oder beim Anmelden an einem entfernten Computer mit SSH.
"gewöhnliche" interaktive Shell. Dies ist normalerweise beim Starten von xterm, konsole, gnome-terminal oder ähnlichen Tools der Fall.
nicht interaktive Shell. Dies wird beim Aufrufen eines Shell-Skripts in der Kommandozeile verwendet.
Abhängig vom verwendeten Shell-Typ werden unterschiedliche Konfigurationsdateien gelesen. Die folgenden Tabellen zeigen die Login- und Nicht-Login-Shell-Konfigurationsdateien.
Tabelle 20.1. Bash-Konfigurationsdateien für Login-Shells
Datei |
Beschreibung |
---|---|
|
Bearbeiten Sie diese Datei nicht, andernfalls können Ihre Änderungen bei Ihrem nächsten Update zerstört werden. |
|
Verwenden Sie diese Datei, wenn Sie |
|
Enthält systemweite Konfigurationsdateien für bestimmte Programme |
|
Fügen Sie hier benutzerspezifische Konfigurationsdaten für Login-Shells ein. |
Tabelle 20.2. Bash-Konfigurationsdateien für Nicht-Login-Shells
|
Bearbeiten Sie diese Datei nicht, andernfalls können Ihre Änderungen bei Ihrem nächsten Update zerstört werden. |
|
Verwenden Sie diese Datei, um Ihre systemweiten Änderungen nur für die Bash-Shell einzufügen. |
|
Fügen Sie hier benutzerspezifische Konfigurationsdaten ein. |
Daneben verwendet die Bash-Shell einige weitere Dateien:
Tabelle 20.3. Besondere Dateien für die Bash-Shell
Datei |
Beschreibung |
---|---|
|
Enthält eine Liste aller Kommandos, die Sie eingegeben haben. |
|
Wird beim Abmelden ausgeführt. |
Die folgende Tabelle bietet eine kurze Übersicht über die wichtigsten Verzeichnisse der höheren Ebene auf einem Linux-System. Ausführlichere Informationen über die Verzeichnisse und wichtige Unterverzeichnisse erhalten Sie in der folgenden Liste.
Tabelle 20.4. Überblick über eine Standardverzeichnisstruktur
Verzeichnis |
Inhalt |
---|---|
Root-Verzeichnis - Startpunkt der Verzeichnisstruktur. | |
Grundlegende binäre Dateien, z. B. Kommandos, die der Systemadministrator und normale Benutzer brauchen. Enthält gewöhnlich auch die Shells, z. B. Bash. | |
Statische Dateien des Bootloaders. | |
Erforderliche Dateien für den Zugriff auf Host-spezifische Geräte. | |
Host-spezifische Systemkonfigurationsdateien. | |
Enthält die Home-Verzeichnisse aller Benutzer mit einem Konto im System. Das Home-Verzeichnis von | |
Grundlegende freigegebene Bibliotheken und Kernel-Module. | |
Einhängepunkte für Wechselmedien. | |
Einhängepunkt für das temporäre Einhängen eines Dateisystems. | |
Add-on-Anwendungssoftwarepakete. | |
Home-Verzeichnis für den Superuser | |
Grundlegende Systembinärdateien. | |
Daten für Dienste, die das System bereitstellt. | |
Temporäre Dateien. | |
Sekundäre Hierarchie mit Nur-Lese-Daten. | |
Variable Daten wie Protokolldateien. | |
Nur verfügbar, wenn sowohl Microsoft Windows* als auch Linux auf Ihrem System installiert ist. Enthält die Windows-Daten. |
Die folgende Liste bietet detailliertere Informationen und einige Beispiele für die Dateien und Unterverzeichnisse, die in den Verzeichnissen verfügbar sind:
/bin
Enthält die grundlegenden Shell-Kommandos, die root
und andere Benutzer verwenden können. Zu diesen Kommandos gehören ls, mkdir, cp, mv, rm und rmdir. /bin
enthält auch Bash, die Standard-Shell in openSUSE.
/boot
Enthält Daten, die zum Booten erforderlich sind, wie zum Beispiel den Bootloader, den Kernel und andere Daten, die verwendet werden, bevor der Kernel mit der Ausführung von Programmen im Benutzermodus beginnt.
/dev
Enthält Gerätedateien, die Hardware-Komponenten darstellen.
/etc
Enthält lokale Konfigurationsdateien, die den Betrieb von Programmen wie das X Window System steuern können. Das Unterverzeichnis /etc/init.d
enthält Skripten, die während des Bootvorgangs ausgeführt werden.
/home/Benutzername
Enthält die privaten Daten aller Benutzer, die ein Konto auf dem System haben. Die Dateien, die hier gespeichert sind, können nur durch den Besitzer oder den Systemadministrator geändert werden. Standardmäßig befinden sich hier Ihr E-Mail-Verzeichnis und Ihre persönliche Desktopkonfiguration in Form von verborgenen Dateien und Verzeichnissen. KDE-Benutzer finden die persönlichen Konfigurationsdaten für den Desktop unter .kde4
, GNOME-Benutzer unter .gconf
. Informationen zu verborgenen Dateien finden Sie unter Abschnitt „Wichtigste Merkmale“ (Kapitel 6, Grundlegende Konzepte, ↑Start).
Home-Verzeichnis in einer Netzwerkumgebung | |
---|---|
Wenn Sie in einer Netzwerkumgebung arbeiten, kann Ihr Home-Verzeichnis einem von |
/lib
Enthält die grundlegenden freigegebenen Bibliotheken, die zum Booten des Systems und zur Ausführung der Kommandos im Root-Dateisystem erforderlich sind. Freigegebene Bibliotheken entsprechen in Windows DLL-Dateien.
/media
Enthält Einhängepunkte für Wechselmedien, wie zum Beispiel CD-ROMs, USB-Sticks und Digitalkameras (sofern sie USB verwenden). Unter
/media sind beliebige Laufwerktypen gespeichert, mit Ausnahme der Festplatte Ihres Systems. Sobald Ihr Wechselmedium eingelegt bzw. mit dem System verbunden und eingehängt wurde, können Sie von hier darauf zugreifen.
/mnt
Dieses Verzeichnis bietet einen Einhängepunkt für ein temporär eingehängtes Dateisystem. root
kann hier Dateisysteme einhängen.
/opt
Reserviert für die Installation von Drittanbieter-Software. Hier finden Sie optionale Softwareprogramme und größere Add-on-Programmpakete.
/root
Home-Verzeichnis für den Benutzer root
. Hier befinden sich die persönlichen Daten von "root
".
/sbin
Wie durch das s
angegeben, enthält dieses Verzeichnis Dienstprogramme für den Superuser. /sbin
enthält die Binärdateien, die zusätzlich zu den Binärdateien in /bin
zum Booten und Wiederherstellen des Systems unbedingt erforderlich sind.
/srv
Enhält Daten für Dienste, die das System bereitstellt, z. B. FTP und HTTP.
/tmp
Dieses Verzeichnis wird von Programmen benutzt, die eine temporäre Speicherung von Dateien verlangen.
Bereinigen des temporären Verzeichnisses /tmp bei Systemstart | |
---|---|
Im Verzeichnis |
/usr
/usr
hat nichts mit Benutzern ("user") zu tun, sondern ist das Akronym für UNIX-Systemressourcen. Die Daten in /usr
sind statische, schreibgeschützte Daten, die auf verschiedenen Hosts freigegeben sein können, die den Filesystem Hierarchy Standard (FHS) einhalten. Dieses Verzeichnis enthält alle Anwendungsprogramme und bildet eine sekundäre Hierarchie im Dateisystem. Dort befinden sich auch KDE4 und GNOME. /usr
enthält eine Reihe von Unterverzeichnissen, z. B. /usr/bin
, /usr/sbin
, /usr/local
und /usr/share/doc
.
/usr/bin
Enthält Programme, die für den allgemeinen Zugriff verfügbar sind.
/usr/sbin
Enthält System-Daemons und Programme, die für den Systemadministrator reserviert und zum Starten des Systems nicht zwingend erforderlich sind.
/usr/local
In diesem Verzeichnis kann der Systemadministrator lokale, verteilungsunabhängige Erweiterungen installieren.
/usr/share/doc
Enthält verschiedene Dokumentationsdateien und die Versionshinweise für Ihr System. Im Unterverzeichnis Handbuch
befindet sich eine Online-Version dieses Handbuchs. Wenn mehrere Sprachen installiert sind, kann dieses Verzeichnis die Handbücher für verschiedene Sprachen enthalten.
Im Verzeichnis Pakete
finden Sie die Dokumentation zu den auf Ihrem System installierten Software-Paketen. Für jedes Paket wird ein Unterverzeichnis /usr/share/doc/packages/
angelegt, das häufig README-Dateien für das Paket und manchmal Beispiele, Konfigurationsdateien oder zusätzliche Skripten umfasst.
Paketname
Wenn HOWTOs (Verfahrensbeschreibungen) auf Ihrem System installiert sind, enhält /usr/share/doc
auch das Unterverzeichnis howto
mit zusätzlicher Dokumentation zu vielen Aufgaben im Zusammenhang mit der Einrichtung und Ausführung von Linux-Software.
/var
Während /usr
statische, schreibgeschützte Daten enthält, ist /var
für Daten, die während des Systembetriebs geschrieben werden und daher variabel sind, z. B. Protokolldateien oder Spooling-Daten. Eine Übersicht über die wichtigsten Protokolldateien finden Sie unter /var/log/
. Weitere Informationen stehen unter Tabelle „Protokolldateien“ (↑Start) zur Verfügung.
/windows
Nur verfügbar, wenn sowohl Microsoft Windows als auch Linux auf Ihrem System installiert ist. Enthält die Windows-Daten, die auf der Windows-Partition Ihres Systems verfügbar sind. Ob Sie die Daten in diesem Verzeichnis bearbeiten können, hängt vom Dateisystem ab, das Ihre Windows-Partition verwendet. Falls es sich um FAT32 handelt, können Sie die Dateien in diesem Verzeichnis öffnen und bearbeiten. Für NTFS unterstützt openSUSE auch den Schreibzugriff. Die Funktionalität des Treibers für das NTFS-3g-Dateisystem ist jedoch eingeschränkt. Weitere Informationen dazu finden Sie unter Abschnitt 34.4, „Zugreifen auf Dateien auf verschiedenen Betriebssystemen am selben Computer “.
Shell-Skripte bieten eine bequeme Möglichkeit, alle möglichen Aufgaben zu erledigen: Erfassen von Daten, Suche nach einem Wort oder Begriff in einem Text und viele andere nützliche Dinge. Das folgende Beispiel zeigt ein kleines Shell-Skript, das einen Text druckt:
Beispiel 20.1. Ein Shell-Skript, das einen Text druckt
#!/bin/sh # Output the following line: echo "Hello World"
Bevor Sie dieses Skript ausführen können, müssen einige Voraussetzungen erfüllt sein:
Jedes Skript muss eine Shebang-Zeile enthalten. (Dies ist im obigen Beispiel bereits der Fall.) Wenn ein Skript diese Zeile nicht enthält, müssen Sie den Interpreter manuell aufrufen.
Sie können das Skript an beliebiger Stelle speichern. Jedoch empfiehlt es sich, es in einem Verzeichnis zu speichern, in dem die Shell es finden kann. Der Suchpfad in einer Shell wird durch die Umgebungsvariable PATH
bestimmt. In der Regel verfügt ein normaler Benutzer über keinen Schreibzugriff auf /usr/bin
. Daher sollten Sie Ihre Skripten im Benutzerverzeichnis ~/bin/
speichern. Das obige Beispiel erhält den Namen hello.sh
.
Das Skript muss zum Ausführen von Dateien berechtigt sein. Stellen Sie die Berechtigungen mit dem folgenden Kommando ein:
chmod +x ~/bin/hello.sh
Wenn Sie alle oben genannten Voraussetzungen erfüllt haben, können Sie das Skript mithilfe der folgenden Methoden ausführen:
Als absoluten Pfad. Das Skript kann mit einem absoluten Pfad ausgeführt werden. In unserem Fall lautet er ~/bin/hello.sh.
Überall.
Wenn die Umgebungsvariable PATH
das Verzeichnis enthält, in dem sich das Skript befindet, können Sie das Skript einfach mit hello.sh ausführen.
Jedes Kommando kann drei Kanäle für Eingabe oder Ausgabe verwenden:
Standardausgabe. Dies ist der Standardausgabe-Kanal. Immer wenn ein Kommando eine Ausgabe erzeugt, verwendet es den Standardausgabe-Kanal.
Standardeingabe. Wenn ein Kommando Eingaben von Benutzern oder anderen Kommandos benötigt, verwendet es diesen Kanal.
Standardfehler. Kommandos verwenden diesen Kanal zum Melden von Fehlern.
Zum Umlenken dieser Kanäle bestehen folgende Möglichkeiten:
Kommando > Datei
Speichert die Ausgabe des Kommandos in eine Datei; eine etwaige bestehende Datei wird gelöscht. Beispielsweise schreibt das Kommando ls seine Ausgabe in die Datei listing.txt
:
ls > listing.txt
Kommando >> Datei
Hängt die Ausgabe des Kommandos an eine Datei an. Beispielsweise hängt das Kommando ls seine Ausgabe an die Datei listing.txt
an:
ls >> listing.txt
Kommando < Datei
Liest die Datei als Eingabe für das angegebene Kommando. Beispielsweise liest das Kommando read den Inhalt der Datei in die Variable a
ein:
read a < foo
Kommando1 | Kommando2
Leitet die Ausgabe des linken Kommandos als Eingabe für das rechte Kommando um. Beispiel: Das Kommando cat gibt den Inhalt der Datei /proc/cpuinfo
aus. Diese Ausgabe wird von grep verwendet, um nur diejenigen Zeilen herauszufiltern, die cpu
enthalten:
cat /proc/cpuinfo | grep cpu
Jeder Kanal verfügt über einen Dateideskriptor: 0 (Null) für Standardeingabe, 1 für Standardausgabe und 2 für Standardfehler. Es ist zulässig, diesen Dateideskriptor vor einem <
- oder >
-Zeichen einzufügen. Beispielsweise sucht die folgende Zeile nach einer Datei, die mit foo
beginnt, aber seine Fehlermeldungen durch Umlenkung zum Papierkorb /dev/null
unterdrückt:
find / -name "foo*" 2>/dev/null
Ein Alias ist ein Definitionskürzel für einen oder mehrere Kommandos. Dies ist nützlich, wenn Kommandos schwer zu merken sind oder zahlreiche Optionen enthalten. Die Syntax für einen Alias lautet:
aliasNAME
=DEFINITION
Beispielsweise definiert die folgende Zeile den Alias lt, der eine lange Liste ausgibt (Option -l
), sie nach Änderungszeit sortiert (-t
) und sie bei der Sortierung in umgekehrter Reihenfolge ausgibt (-r
):
alias lt='ls -ltr'
Zur Anzeige aller Aliasdefinitionen verwenden Sie alias. Entfernen Sie Ihren Alias mit unalias.
Eine Shell-Variable kann global oder lokal sein. Auf globale Variablen, z. B. Umgebungsvariablen, kann in allen Shells zugegriffen werden. Lokale Variablen sind hingegen nur in der aktuellen Shell sichtbar.
Verwenden Sie zur Anzeige von allen Umgebungsvariablen das Kommando printenv. Wenn Sie den Wert einer Variable kennen müssen, fügen Sie den Namen Ihrer Variablen als ein Argument ein:
printenv PATH
Eine Variable (global oder lokal) kann auch mit echo angezeigt werden:
echo $PATH
Verwenden Sie zum Festlegen einer lokalen Variablen einen Variablennamen, gefolgt vom Gleichheitszeichen und dem Wert für den Namen:
PROJECT="SLED"
Geben Sie keine Leerzeichen um das Gleichheitszeichen ein, sonst erhalten Sie einen Fehler. Verwenden Sie zum Setzen einer Umgebungsvariablen export:
export NAME="tux"
Zum Entfernen einer Variable verwenden Sie unset:
unset NAME
Die folgende Tabelle enthält einige häufige Umgebungsvariablen, die Sie in Ihren Shell-Skripten verwenden können:
Tabelle 20.5. Nützliche Umgebungsvariablen
|
Home-Verzeichnis des aktuellen Benutzers |
|
Aktueller Hostname |
|
Wenn ein Werkzeug lokalisiert wird, verwendet es die Sprache aus dieser Umgebungsvariablen. Englisch kann auch auf |
|
Suchpfad der Shell, eine Liste von Verzeichnissen, die durch Doppelpunkte getrennt sind |
|
Gibt die normale Eingabeaufforderung an, die vor jedem Kommando angezeigt wird |
|
Gibt die sekundäre Eingabeaufforderung an, die beim Ausführen eines mehrzeiligen Kommandos angezeigt wird |
|
Aktuelles Arbeitsverzeichnis |
|
Aktueller Benutzer |
Wenn Sie beispielsweise über das Skript foo.sh verfügen, können Sie es wie folgt ausführen:
foo.sh "Tux Penguin" 2000
Für den Zugriff auf alle Argumente, die an Ihr Skript übergeben werden, benötigen Sie Positionsparameter. Diese sind $1
für das erste Argument, $2
für das zweite usw. Sie können bis zu neun Parameter verwenden. Verwenden Sie $0
zum Abrufen des Skriptnamens.
Das folgende Skript foo.sh gibt alle Argumente von 1 bis 4 aus:
#!/bin/sh echo \"$1\" \"$2\" \"$3\" \"$4\"
Wenn Sie das Skript mit den obigen Argumenten ausführen, erhalten Sie Folgendes:
"Tux Penguin" "2000" "" ""
Variablenersetzungen wenden beginnend von links oder rechts ein Schema auf den Inhalt einer Variable an. Die folgende Liste enthält die möglichen Syntaxformen:
${VAR#schema}
entfernt die kürzeste mögliche Übereinstimmung von links:
file=/home/tux/book/book.tar.bz2 echo ${file#*/} home/tux/book/book.tar.bz2
${VAR##schema}
entfernt die längste mögliche Übereinstimmung von links:
file=/home/tux/book/book.tar.bz2 echo ${file##*/} book.tar.bz2
${VAR%schema}
entfernt die kürzeste mögliche Übereinstimmung von rechts:
file=/home/tux/book/book.tar.bz2 echo ${file%.*} /home/tux/book/book.tar
${VAR%%schema}
entfernt die längste mögliche Übereinstimmung von rechts:
file=/home/tux/book/book.tar.bz2 echo ${file%%.*} /home/tux/book/book
${VAR/pattern_1/pattern_2}
ersetzt den Inhalt von VAR
von pattern_1
durch pattern_2
:
file=/home/tux/book/book.tar.bz2 echo ${file/tux/wilber} /home/wilber/book/book.tar.bz2
In Shells können Sie Kommandos für die bedingte Ausführung verketten und gruppieren. Jedes Kommando übergibt einen Endcode, der den Erfolg oder Misserfolg seiner Ausführung bestimmt. Wenn er 0 (Null) lautet, war das Kommando erfolgreich, alle anderen Codes bezeichnen einen Fehler, der spezifisch für das Kommando ist.
Die folgende Liste zeigt, wie sich Kommandos gruppieren lassen:
Kommando1 ; Kommando2
führt die Kommandos in sequenzieller Reihenfolge aus. Der Endcode wird nicht geprüft. Die folgende Zeile zeigt den Inhalt der Datei mit cat an und gibt deren Dateieigenschaften unabhängig von deren Endcodes mit ls aus:
cat filelist.txt ; ls -l filelist.txt
Kommando1 && Kommando2
führt das rechte Kommando aus, wenn das linke Kommando erfolgreich war (logisches UND). Die folgende Zeile zeigt den Inahlt der Datei an und gibt deren Dateieigenschaften nur aus, wenn das vorherige Kommando erfolgreich war (vgl. mit dem vorherigen Eintrag in dieser Liste):
cat filelist.txt && ls -l filelist.txt
Kommando1 || Kommando2
führt das rechte Kommando aus, wenn das linke Kommando fehlgeschlagen ist (logisches ODER). Die folgende Zeile legt nur ein Verzeichnis in /home/wilber/bar
an, wenn die Erstellung des Verzeichnisses in /home/tux/foo
fehlgeschlagen ist:
mkdir /home/tux/foo || mkdir /home/wilber/bar
funcname(){ ... }
erstellt eine Shell-Funktion. Sie können mithilfe der Positionsparameter auf ihre Argumente zugreifen. Die folgende Zeile definiert die Funktion hello
für die Ausgabe einer kurzen Meldung:
hello() { echo "Hello $1"; }
Sie können diese Funktion wie folgt aufrufen:
hello Tux
Die Ausgabe sieht wie folgt aus:
Hello Tux
Zur Steuerung des Ablaufs Ihres Skripts verfügt eine Shell über while-, if-, for- und case-Konstrukte.
Das Kommando if wird verwendet, um Ausdrücke zu prüfen. Beispielsweise testet der folgende Code, ob es sich beim aktuellen Benutzer um Tux handelt:
if test $USER = "tux" ;then echo "Hello Tux." else echo "You are not Tux." fi
Der Testausdruck kann so komplex oder einfach wie möglich sein. Der folgende Ausdruck prüft, ob die Datei foo.txt
existiert:
if test -e /tmp/foo.txt ; then echo "Found foo.txt" fi
Der Testausdruck kann auch in eckigen Klammern abgekürzt werden:
if [ -e /tmp/foo.txt ] ; then echo "Found foo.txt" fi
Weitere nützliche Ausdrücke finden Sie unter http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst/ch03sec02.html.
Wichtige Informationen über die Bash-Shell finden Sie auf den man-Seiten zu man sh. Für weitere Informationen zu diesem Thema siehe die folgende Liste:
http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html– Bash Guide for Beginners (Bash-Anleitungen für Anfänger)
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html– BASH Programming - Introduction HOW-TO (BASH-Programmierung – Einführende schrittweise Anleitungen)
http://tldp.org/LDP/abs/html/index.html– Advanced Bash-Scripting Guide (Bash-Skript-Anleitungen für Fortgeschrittene)
http://www.grymoire.com/Unix/Sh.html– Sh - the Bourne Shell (Sh – die Bourne-Shell)