logoOL.gif
user_gelb_schwarz_or.gif
logoUL.gif
logoUR.gif claim.gif
LinuxUser LinuxCommunity EasyLinux Linux-Magazin International
      Anzeige
TFT Monitor bei Mercateo kaufen.
Neues Netbook? Ein Preisvergleich lohnt sich.
Bei uns finden sie Notebooks, PDAs und Drucker mit Testberichten und Tipps.
Diamant Buchhaltungssoftware – transparent und detailliert auch für die Konzernbuchhaltung.
Günstige Shareware Programme als direkte Downloads im Software Portal.
Bis zu 70% sparen durch Preisvergleich.
      Anzeige

Erschienen in LinuxUser 02/2001   »   Ausgabe bestellen

Konfiguration der Bash (1)

von Karsten Günther

Die elementaren Konfigurationsmöglichkeiten mit eingebauten Funktionen der Bash sind der Schwerpunkt dieses Teils. Im nächsten wird ein komfortables Tool zur Erzeugung von Konfigurationsdateien vorgestellt.

Ein Überblick

Die Bash bietet dem Anwender zahlreiche Möglichkeiten, ihr Verhalten an seine Wünsche anzupassen. Die meisten Einstellungen können zunächst einmal temporär -- quasi "auf Probe" -- in einer Sitzung vorgenommen werden. Haben sich die entsprechenden Einstellungen bewährt, dann empfiehlt es sich, sie in eine Konfigurationsdatei zu übernehmen, damit sie von nun an immer zur Verfügung stehen. Anders als viele andere Programme verwendet die Bash eine ganze Reihe von Konfigurationsdateien, die abhängig von der Einsatzweise ausgewertet werden.

Die Einstellungen der Shell durch Variablen in den Konfigurationsdateien und "on the fly" durch den Anwender werden oft mit dem etwas verwirrenden Begriff (Custom) "Environment" beschrieben. Dabei umfasst dies meistens die Readline-Einstellungen, Bash-Variablenzuweisungen und die ausgewählten Bash-Modi. Dieses Environment hat aber nichts mit der Programmumgebung zu tun, siehe dazu den Kasten. Bei der Bash müssen auch einige andere Begriffe streng unterschieden werden: Shelloptionen heißen die Optionen der Bash. Sie werden in den meisten Fällen durch die Bash-Modi (also verschiedene "Zustände" der Shell) repräsentiert. Ein einfaches Beispiel erklärt die Zusammenhänge: Der Editiermodus einer interaktiven Bash kann durch

$> set -o vi 
in den vi-Modus bzw. durch
$> set -o emacs
zurück in den Emacs-Modus geschaltet werden.

Shellvariablen werden von der Bash intern ausgewertet. Die aus der Bash aufgerufenen Programme lesen und interpretieren die Umgebungsvariablen, die ihr Verhalten beeinflussen. Umgebungsvariablen sind in dem "Environment" gespeichert und werden an die von der Bash gestarteten Prozesse weitergegeben, sofern sie als "exportierbar" markiert wurden.

Es gibt aber eine Reihe von Umgebungsvariablen, die sinnvollerweise nur durch die Shell selbst ausgelesen und gesetzt werden sollten, etwa $PWD -- der Name leitet sich vom eingebauten Befehl pwd (print working directory) ab und enthält das aktuelle Verzeichnis.

Die ursprüngliche Bedeutung des Begriffs Environment ist im Zusammenhang mit einer Shell aber eine andere: Als Environment wird die Gesamtheit der Umgebungsvariablen und einiger anderer Parameter wie der PID des Prozesses und die des aufrufenden Prozesses, das kontrollierende Terminal, etc. bezeichnet, wie sie beim Start eines Programms (in diesem Zusammenhang wird der Terminus Prozess verwendet) definiert sind.


Environment: Eine Anzahl von (Environment-) Variablen, deren Inhalt dem Prozess Informationen über die Umgebung gibt, in der sich die Ausführung abspielt. So ist im Environment der Typ der Shell gespeichert, die den Prozess gestartet hat, das Terminal, mit dem er verbunden ist, und vieles mehr. Die wichtigsten Teile des Environments können mit dem Befehl printenv angezeigt werden Mit dem Befehl env kann ein Environment vom Anwender vor dem Programmstart modifiziert werden. Einzelne Variablen stellen die Shell-Befehle (declare oder export auf der Bash oder setenv bei der C-Shell) ein.

Prozess: Ein gerade laufendes Programm wird unter Linux als Prozess bezeichnet. Zu einem Prozess gehören neben der ausführbaren Datei noch weitere Informationen: das Environment, Daten über den Prozess selbst und über den Prozess, von dem er gestartet wurde (Vater-Prozess). Prozesse werden über die ihnen zugeordnete Prozessidentifikationsnummer (PID) identifiziert, nicht etwa über den Programmnamen.

Programme sind unter Linux einfach ausführbare Dateien, also binäre (kompilierte) Programme oder interpretierte Skripte. Die Ausführbarkeit einer Datei wird anhand des x-Bits bei den Dateiattributen festgestellt und festgelegt.

Login-Shell: Die Shell, die nach der Anmeldung am System (Login) verwendet wird, bildet die Basis für alle weiteren Prozesse. Sie wird daher besonders aufwendig konfiguriert. Die von ihr aus gestarteten Prozesse (beispielsweise interaktive Shells) "erben" die meisten Einstellungen. Als interaktive (Sub) Shell werden die "normalen" Shells für den Anwender bezeichnet, die ihm in Terminals oder virtuellen Konsolen zur Verfügung stehen. Eine nicht interaktive (Sub) Shell tritt nur bei der Bearbeitung von Shell-Skripten auf. Sie dient dann als Interpreter der im Skript vorhandenen Befehle. Wenn eine Shell eine weitere Shell startet, sprich man von einer Subshell. Diese erbt wesentliche Eigenschaften von der ersten, u. a. das Environment. Alle von einer Login-Shell aus gestarteten Shells können als Subshell bezeichnet werden.


Konfigurationsdateien

Beim Start liest die Bash eine Reihe von Konfigurationsdateien ein, interpretiert deren Inhalt und übernimmt bestimmte Einstellungen. Was dabei genau geschieht, hängt von mehreren Faktoren ab.

Zum einen kann die Bash in drei unterschiedlichen Weisen eingesetzt werden -- bei jeder dieser Einsatzweisen liest die Shell andere Konfigurationsdateien ein; zum anderen werden jeweils mehrere Alternativen der Konfigurationsdateien gesucht. Die erste gefundene Datei wird dann eingelesen. Weitere werden nicht mehr gesucht.

Damit bei einer Login-Shell auch Funktionen einer interaktiven Shell zur Verfügung stehen, wird am Ende der Login-Konfigurationsdatei oft auch die persönliche Konfigurationsdatei im Home-Verzeichnis des Anwenders eingelesen.

SuSE Linux löst die Konfiguration der Bash in folgender Weise: Die systemweite Konfiguration erfolgt in der Datei /etc/profile, an deren Ende weitere Konfigurationsdateien eingelesen werden:

...
test -e /etc/SuSEconfig/profile && . /etc/SuSEconfig/profile
...
test -d /etc/profile.d && \
  {
    for s in /etc/profile.d/*.sh ; do
      test -r $s && . $s
    done
  } 
...
test -e /etc/profile.local && . /etc/profile.local 

Einige Anmerkungen zu diesen Zeilen: Die bei der Installation erzeugten Konfigurationsdateien tragen alle den expliziten Hinweis, dass diese Dateien nicht manuell verändert werden sollen! Zum test-Befehl: Dieser wurde im letzten Teil vorgestellt, deshalb hier nur soviel: Mit der Option -d (directory) prüft der Befehl, ob das im folgenden Argument angegebene Verzeichnis existiert. Wenn ja, werden die folgenden Befehle ausgeführt. In diesem Verzeichnis sind für die spezielle Programmpakete benötigten Initialisierungs-Dateien vorhanden. Ähnlich verhält es sich bei der Option -r (read): Durch sie wird nach lesbaren Dateien (vorhanden und mit Leseberechtigung versehen) gesucht. Entsprechendes gilt für die Option -e (execute): Diese bewirkt den Test, ob die im Argument angegebene Datei ausführbar ist.

Befehle in der Datei /etc/profile sollen immer in einer zur "Ur"-Shell kompatiblen Syntax benutzt werden, da bei verschiedenen Shells die Grundkonfiguration über diese Datei erfolgt. Oft wird in dieser Datei daher nur ein minimales Environment definiert und die eigentliche Konfiguration in andere Dateien ausgelagert. Lokale (distributionsspezifische) Anpassungen werden gern in einer externen Datei vorgenommen, wie dies in dem Beispiel oben anhand der Datei /etc/profile.local gezeigt wurde.

Logout: Auch beim Verlassen der Shell können von der Bash noch automatisch Befehle ausgeführt werden. Das ist besonders praktisch, wenn man es sich zur Aufgabe macht, die Arbeiten des Tages zu sichern, Aufzuräumen (temporäre Dateien, Core-Dumps (Programmleichen) etc. zu löschen) oder vieles mehr. Die Bash führt beim Eintreffen eines exit-Befehls die Datei .bash_logout im Home-Verzeichnis des Anwenders aus. Nicht alle Versionen der Bash werten diese Datei korrekt aus.

Achtung: Beim Update des Systems sollten inzwischen alle Distributionen veränderte Konfigurationsdateien erkennen und unangetastet lassen. Bei Verwendung von rpm (Red Hat Package Manager) werden modifizierte Dateien mit der Endung .rpmsave oder .rpmorig versehen. Um jederzeit auf die persönlichen Einstellungen zugreifen zu können, ist es sinnvoll, wenn diese in einer speziellen Datei gespeichert werden. Unter SuSE Linux wird beispielsweise die automatische Auswertung der Datei ~/.alias durch die folgende Abfrage in .bashrc veranlasst:

test -e ~/.alias && . ~/.alias

Das Einlesen von Konfigurationsdateien kann beim Start der Bash durch die Befehlszeilenoptionen --noprofile und --norc unterbunden werden. Alternative Konfigurationsdateien können für die Bash als Argument der Option --rcfile angegeben werden.

Bash-Modi

Die Grundeinstellungen der Bash werden wie oben beschrieben als "Modi" bezeichnet. Sie haben Einfluss auf viele interne Funktionen, wie dies leicht am Beispiel der Editierfunktionen nachvollzogen werden kann. Im Emacs-Modus werden andere Tastenbindungen unterstützt als im vi-Modus.

Bash-Modi werden entweder beim Start der Shell als Befehlszeilenoptionen angegeben oder in einer laufenden Shell durch die (elementaren) eingebauten Befehle set oder shopt (erweiterte Funktionen) aktiviert.

Der set-Befehl

Viele grundlegende Funktionen, die bereits bei der Bash-Version 1.x vorhanden waren, werden mit diesem Befehl eingestellt. Die allgemein gültige Syntax für diesen Befehl lautet:

set Variable Wert
set +/- Option

Die erste Variante entspricht der Variablenzuweisung bei der "Ur"-Shell; auf einer Bash gibt es elegantere Möglichkeiten. Mit der zweiten Form werden die Shell-Variablen gesetzt. Der set-Befehl kann die in der Tabelle 1 zusammengefassten Shell-Variablen einstellen. Die aktuellen Einstellungen sind über die Umgebungsvariable $- zugänglich:

$> echo $-
ahimpBH   

Ohne eine Optionsangabe bewirkt der Aufruf von set die Auflistung aller Einstellungen zur Laufzeit:

$> set  
BASH=/usr/bin/bash
BASH_VERSINFO=([0]="2" [1]="...
...
XNLSPATH=/usr/X11R6/lib/X11/nls
_=bash  
ignoreeof=10
no_proxy=localhost  
-=()
{
    popd;
    ls $LS_OPTION
}  
...
ucdrom=()
{
  umount /cdrom/ && eject /cdrom
}

Zunächst werden alle deklarierten Variablen in alphabetischer Reihenfolge aufgelistet (BASH=... bis no_proxy=localhost). In dieser Liste treten auch einige "interne" Variablen auf: BASH_VERSINFO ist ein Array, in dem in fünf Feldern Informationen zur aktuellen Bash enthalten sind. Der DIRSTACK enthält in mehreren Feldern die mittels pushd gespeicherten Verzeichnisnamen. Diese können der Reihe nach durch popd wieder vom Stack genommen werden.

An die Liste deklarierter Variablen schließen sich ohne Lücke die Definitionen aller vorhandenen Funktionen an (-=()... bis zum Ende). Shell-Funktionen wurden im letzten Teil des Bash-Kurses vorgestellt.


Tabelle 1: Mittels set einstellbare Optionen der Bash
Option Name Funktion
-a allexport neu definierte oder veränderte Variablen werden automatisch exportiert
-b notify bewirkt, dass Meldungen von Hintergrundjobs sofort ausgegeben werden (voreingestellt wartet die Bash bis zur Ausgabe des nächsten Prompts)
-B braceexpand Klammerexpandierungen erlauben (entspricht der Voreinstellung)
-C noclubber Setzen dieser Option verhindert, dass bestehende Dateien durch Ausgabeumleitungen (Redirections) zerstört werden
-e errexit In diesem Modus beendet sich die Shell immer dann automatisch, wenn ein Befehl einen Fehlercode erzeugte
-f noglob Deaktiviert die Komplettierungsfunktion für Dateinamen
-h hashall Deaktiviert das Speichern der Pfade bereits einmal ausgeführter externer Befehle; ein Abschalten bewirkt längere Ausführungszeiten bei Skripten
-H histexpand Erlaubt erweiterte Ersetzungen aus dem Historybuffer (voreingestellt: on)
-k keyword Zuweisungen werden in das Environment des Befehls übernommen
-m monitor Aktiviert die Job-Kontrollfunktionen (Voreinstellung: on bei interaktiven Shells)
-n noexec Verhindert die Ausführung von Befehlen; die Syntax wird aber überprüft und gegebenenfalls Fehlermeldungen erzeugt (deaktiviert bei interaktiven Shells)
-o Option setzt die im Argument übergebene Option, siehe das Beispiel oben
-p privileged Aktiviert den privilegierten Modus
-P physical Unterdrückt die Darstellung von symbolischen Links, statt dessen wird das physikalische Verzeichnis verwendet
-t onecmd Die Shell terminiert nach dem Ausführen des ersten Befehls
-u nounset Bewirkt, dass ungesetzt Variablen Fehlermeldungen erzeugen; ohne diese Option wird ihnen ein leerer Inhalt zugewiesen
-v verbose Befehlszeilen werden angezeigt, bevor sie ausgeführt werden
-x xtrace Alle Befehlszeilen werden mit expandierten Argumenten angezeigt, bevor sie ausgeführt werden


Eine andere Anwendung von set sahen Sie im Skript testlp in der letzten Folge. Dort wurde durch

set -- `ls -l $lp`
die Ausgabe von ls -l in Form von Positionsparametern verfügbar gemacht.

Mittels set gesetzte Variablen (Option -v) können ebenso wie Funktionen (Option -f) durch unset wieder aus dem Environment gelöscht werden.

Der shopt-Befehl

Mit der Einführung der Bash-Version 2.0 gibt es viele neue Konfigurations-Features. Sie werden durch den "erweiterten Konfigurationsbefehl" shopt gesetzt oder angezeigt.

$> shopt
cdable_vars     off
cdspell         off
checkhash       off 
...
$> echo $SHELLOPTS
braceexpand:hashall:histexpand:monitor:...

Die aktuellen Optionen sind über die Variable SHELLOPTS zugänglich.

Tabelle 2: Mittels shopt einstellbare Optionen der Bash
Option Funktion
cdable_vars bewirkt, dass die Bash Argumente des cd-Befehls als Variablen interpretiert, wenn es sich um keine Verzeichnisse handelt
cdspell einfache Schreibfehler (vertauschte oder fehlende Buchstaben) in Verzeichnisnamen werden durch diese Option automatisch korrigiert
checkhash die Bash sucht einen externen Befehl zunächst in der Hashtabelle, bevor er anhand des Suchpfades gefunden wird
checkwinsize wenn diese Option aktiviert ist, prüft die Bash nach jedem ausgeführten Befehl, ob sich die Terminal-Abmessungen geändert haben.
cmdhist zusammengehörige Befehlszeilen werden in der History in Form einer Zeile abgelegt, dadurch vereinfacht sich ihre Bearbeitung
dotglob durch das Setzen dieser Option werden auch die mit einem Punkt beginnenden Dateinamen beim automatischen Komplettieren berücksichtigt
execfail verhindert in Skripten, dass die Shell nach einem Fehler in einem exec-Befehl terminiert
histexpand bewirkt, dass Historydateien nicht mehr überschrieben, sondern an bestehende Dateien angehängt werden
lithist zusammen mit cmdhist bewirkt sie das Zusammenfassen mehrzeiliger Befehle
sourcepath der source-Befehl kann auf die PATH-Variable zugreifen, wenn diese Option gesetzt ist
expand_aliases erlaubt das Expandieren von Alias-Definitionen
nocaseglob bei der automatischen Dateinamenkomplettierung berücksichtigt die Bash Groß-/Kleinschreibung nicht, wenn diese Option aktiv ist
huponexit allen von einer interaktiven Shell ausgeführten Hintergrundjobs wird ein SIGHUP-Signal gesendet, wenn sie terminiert
restricted_shell die Bash wird im Restricted-Modus mit eingeschränkter Funktionalität betrieben


In Tabelle 2 sind die wichtigsten Bash-Optionen aufgeführt, die mittels shopt gesetzt werden können. Eine vollständige Liste ist in [2] enthalten. Der Befehl verfügt über folgende Optionen: -p (print) gibt eine Liste der aktuellen Einstellungen aus, -s (set) setzt die im Argument angegebene Option, -u (unset) löscht sie. Durch -q (quiet) wird die Ausgabe des Befehls unterdrückt, wie dies in Skripten praktisch sein kann. Durch -o beschränkt sich die Wirkung von shopt auf die durch set -o gesetzten Optionen.

Fazit

Auch die Konfiguration der Bash birgt keine unüberwindbaren Hindernisse. Viele Features lassen sich einfach und unabhängig voneinander einstellen. Die Einstellungen sollten nach einer gewissen "Erprobungsphase" in die entsprechenden Konfigurationsdateien übernommen werden, damit sie immer zur Verfügung stehen. (hge)

Literatur

[1] K. Günther: Kompaktreferenz Linux, MITP 2000
[2] Zilm, Th., Grelck, K.: Linux -- die User-Referenz, MITP 1999

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.




Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2010 Linux New Media AG

[Linux-Magazin] [LinuxUser] [EasyLinux] [Linux-Community] [Ubuntu User] [Linux Technical Review] [Linux Magazine] [Linux Pro Magazine] [Ubuntu User]
[EasyLinux Poland] [Linux Magazine Poland] [Linux Magazine Brasil] [EasyLinux Brasil] [Linux Magazine Spain]