Neben den Variablen gibt es noch zwei weitere Formen, die innerhalb einer Shell definiert werden können. Das Alias und die Funktion. Das grundlegende Prinzip der Funktionen haben wir schon bei der Shellprogrammierung kennengelernt, die Aliase sind neu.

Alias

Ein Alias ist sozusagen ein Mechanismus, der der Shell klar macht, dass ein bestimmter Name eine bestimmte Bedeutung hat. Jedesmal, wenn die Shell auf einen Befehl trifft, überprüft sie zuerst, ob es sich dabei um einen Alias handelt, erst wenn es klar ist, dass es kein Alias ist, wird der Unix-Befehl gesucht. Das heißt, dass damit die Bedeutung von Unix-Befehlen überlagert werden kann. Ein Alias wird nur ein einziges Mal aufgelöst, so dass es möglich ist, bestehende Unix-Befehle umzudefinieren.

Beispiele:

alias cp=cp -i

Damit wird der Befehl cp grundsätzlich als cp -i ausgeführt, das heißt, er frägt vor dem Überschreiben einer Zieldatei nach, ob das in Ordnung ist.

alias …=cd ..;cd..

Der Befehl … ist ein Alias auf den Befehl cd ..;cd .., also zweimal ins nächsthöhere Verzeichnis zu wechseln.

alias werbinich=“echo $LOGNAME \($UID\)“

Der Befehl werbinich gibt in einer Zeile den Usernamen und die UserID des Users aus, der ihn ausführt.

Um Aliase wieder loszuwerden gibt es den Befehl unalias mit dem ein Alias wieder gelöscht werden kann.

Zur Gültigkeit von Aliasen gilt genau das selbe, wie zur Gültigkeit von Shellvariablen. Sie haben nur Gültigkeit in der Shell, in der sie definiert wur Im Gegensatz zu Variablen lassen sich Aliase aber nicht exportieren – zumindest nicht bei modernen Shells. Wenn ein Alias auch innerhalb einer Subshell gelten soll, so muß er in einer Konfigurationsdatei definiert werden, die auch von einer No-Login-Shell abgearbeitet wird, also etwa ~/.bashrc.

Funktionen

Der Alias-Mechanismus erlaubt eine vielseitige Anwendung auch kombinierter Befehle, die unter einem neuen Namen zusammengefasst werden. Er hat aber zwei wesentliche Einschränkungen. Innerhalb des Alias ist es nicht möglich, auf einzelne Parameter des Aliases zuzugreifen, die ihm mitgegeben wurden. Es ist ja tatsächlich ein Textersatz, der hier vorgenommen wird.

Der zweite Nachteil des Aliases ist, dass seine Interpretation nur einmal stattfindet, dadurch kann er nicht rekursiv aufgerufen werden.

Beide Nachteile (die in Wahrheit keine Nachteile sind, sondern nur Unterschiede zur Funktion) werden von den Shellfunktionen abgeschafft. Es handelt sich hier um einen echten Funktionsaufruf, der die mitgegebenen Parameter bearbeiten kann und der rekursiv laufen kann, das heißt, die Funktion kann sich selber aufrufen.

Den grundlegenden Aufbau von Funktionen haben wir bei der Shellprogrammierung schon kennengelernt, hier soll jetzt noch gezeigt werden, wie Funktionen auch innerhalb der interaktiven Shell eine vernünftige Rolle spielen können.

Funktionen können direkt eingegeben werden, das ist aber eher selten. Meist werden sie in den Konfigurationsdateien erstellt und exportiert. Sie müssen wie Variablen und Aliase exportiert werden, damit sie auch in späteren Shells gültig sind.

Wollen wir z.B. eine Funktion schreiben, die beim Verzeichniswechsel gleich den Inhalt des Verzeichnisses anzeigt, in das gewechselt wurde, so können wir das folgendermaßen erledigen:

function lscd()
{
  cd $*
  ls
}

In einem Alias wäre das nicht möglich gewesen, weil wir ja den Aufrufparameter ($*) nicht gehabt hätten. Was aber, wenn wir diese Funktion nicht lscd sondern einfach nur cd genannt hätten?

Das hätte ziemlich schnell dazu geführt, dass der Computer keinen Arbeitsspeicher mehr übrig gehabt hätte. Die Funktion hätte sich nämlich permanent selbst aufgerufen. Ohne eine vernünftige Abbruchbedingung hätte das dazu geführt, dass es zu einer Endlosschleife kommt, die in jedem Durchlauf Speicher anfordert…

Damit zumindestens interne Befehle der Shell wie cd überlagert werden können, bietet die Shell das reservierte Wort builtin an, das anzeigt, dass in jedem Fall der interne Befehl und nicht die Funktion aufgerufen werden soll. Um unser Beispiel aso arbeitsfähig zu machen müßten wir schreiben:

function cd()
{
  builtin cd $*
  ls
}