Shellfunktionen laden
Hier zunächst einige Bemerkungen zu der Frage, wann, wo und wie Shellfunktionen geladen
werden.
Konfigurationsdateien: Prinzipiell können Shellfunktionen in einer der Konfigurationsdateien
(.profile , .bashrc etc.) definiert werden, damit sie beim Start jeder
Shell automatisch definiert sind. Es ist aber nicht sinnvoll, jedesmal
alle vorhandenen Shellfunktionen zu laden. Einige (z.B.
Bash-Vervollständigungen) braucht man nur im interaktiven Modus, andere
nur in speziellen Scripten. Im nicht-interaktiven Betrieb sollte man
gar keine Funktionen vordefinieren, sondern lieber eine saubere Umgebung
anbieten und die benötigten Funktionen im Script mit
. datei oder source datei laden. Dabei
empfiehlt es sich, auf absoluten Pfade zu verzichten, die das Script stark an
die Systemumgebung koppeln und seine Portabilität vermindern. Besser ist es,
den Suchmechanismus der Shell zu verwenden.
Suche: Wenn der bei source oder . angegebene
Parameter einen einfachen Namen darstellt, durchsuchen die Shells (sowohl
bash als auch ksh ) die in $PATH enthaltenen
Verzeichnisse nach einer Datei dieses Namens. Die erste gefundene wird
mit source ausgeführt. Die Shell erwartet, dass darin
die aufgerufene Funktion definiert wird, andernfalls, versucht sie, die Datei als Script zu
starten. Um den Suchmechanismus benutzen zu können, muss man also jede Funktion in
einer gleichnamigen Datei abspeichern. In dieser Datei können auch noch andere Dinge
definiert werden, etwa von der Hauptfunktion benötigte Hilfsfunktionen, aber man sollte
solche Seiteneffekte auf ein Minimum beschränken. Die Funktionsquellen
fasst man sinnvollerweise in einigen wenigen Verzeichnissen
zusammen und fügt die Pfade dieser Verzeichnisse, wie üblich durch :
getrennt, der Variablen PATH hinzu. Das z.B. kann in einer der
profile-Dateien geschehen. Danach lassen sich Funktionen unter bloßer
Angabe ihres Namens laden, d.h. mit source funktionsname .
Autoload: Die Kornshell verfügt zudem über einen Autoload-Mechanismus. Um ihn benutzen
zu können, muss man zusätzlich zu den oben erwähnten Vorbereitungen
die Variable FPATH mit einer Liste der
Funktionsverzeichnisse besetzen. $FPATH ist also eine Untermenge von
$PATH . Wenn diese Bedingungen erfüllt sind, sucht ksh
jede aufgerufene Funktion, die noch nicht definiert ist, über $FPATH
und lädt sie automatisch. Ein explizites source ist nicht erforderlich.
Das ist bequem, allerdings kann das Verfahren auch Nachteile haben. Ruft man
nämlich eine Funktion func in einem Script nur in der Form
$(func parameter...)
auf, also nur in Subshells, wird sie bei jedem Aufruf gesucht und
geladen, was ziemlich ineffektiv ist.
[1]
In diesem Fall empfiehlt es sich, die Funktion am Beginn des Scripts explizit
mit source func zu laden; danach wird die Definition automatisch an
Subshells weitergegeben. Achtung: Diese Anweisung darf wirklich nur einmal
gegeben werden. Ist func bereits definiert, bewirkt source func
einen Aufruf, nicht eine Neudefinition. Um sicher zu gehen, kann
man statt des Namens den absoluten Pfad der Definitionsdatei angeben oder
eine Bedingung vorschalten:
typeset +f func >/dev/null || source func
[1] Ab Version ksh93t gibt es eine effizientere Kommandoersetzung
${ kommando;} , die in der aktuellen Shell durchgeführt wird.
|