Das reservierte Wort function (siehe Abschnitt "Zusammengesetzte Anweisungen") wird zur Definition von POSIX-Shell-Funktionen benutzt. Funktionen werden von der Shell eingelesen und intern gespeichert. Alias-Namen werden aufgelöst, wenn die Funktion gelesen wird. Funktionen werden wie Kommandos ausgeführt, Argumente werden als Stellungsparameter übergeben (siehe Abschnitt "Ausführung").
Funktionen werden im aktuellen Prozess ausgeführt und haben Zugriff auf alle geöffneten Dateien und das aktuelle Verzeichnis.
Signale (traps), die vom Aufrufer abgefangen werden, werden innerhalb der Funktion auf ihre Standard-Aktion zurückgesetzt. Ein Signal, das von der Funktion weder abgefangen noch ignoriert wird, führt zum Abbruch der Funktion. Dieses Signal wird an den Aufrufer der Funktion weitergegeben. Eine EXIT-trap-Behandlung, die innerhalb einer Funktion gesetzt wurde, wird nach Beendigung der Funktion in der Umgebung des Aufrufers ausgeführt. Normalerweise werden die Variablen von Aufrufer und Funktion gemeinsam benutzt.
Das eingebaute Kommando typeset kann jedoch dazu benutzt werden, innerhalb einer Funktion lokale Variablen zu definieren, deren Gültigkeitsbereich dann die Funktion und alle aufgerufenen Funktionen umfasst.
Das eingebaute Kommando return wird zur Rückkehr von Funktionen verwendet. Fehler, die innerhalb einer Funktion auftreten, geben die Kontrolle an den Aufrufer zurück.
Die Bezeichner oder Namen von Funktionen können Sie mit Hilfe des eingebauten Kommandos typeset und einer der Optionen -f oder +f auflisten. Den Text der Funktionen können Sie mit der Option -f auflisten. Eine Funktion können Sie mit dem eingebauten Kommando unset und der Option -f löschen.
Normalerweise kann man auf die Funktionen nicht zugreifen, während die POSIX-Shell eine Prozedur ausführt.
Durch die Option -xf des eingebauten Kommandos typeset können Funktionen als exportierbar markiert werden. Diese Funktionen können Sie dann in Prozeduren verwenden, die ohne einen weiteren Aufruf der POSIX-Shell ausgeführt werden. Funktionen, die über mehrere Aufrufe der POSIX-Shell bekannt sein sollen, müssen Sie in der ENV-Datei mit typeset -xf definieren.
Beispiel
Die folgende Funktion lh gibt Ihnen die obersten zwei Schichten der Dateiverzeichnis-Hierarchie aus, an der Sie stehen oder die Sie als Argument angegeben haben. Einfache Dateien als Argument werden ignoriert.
function lh { for i in ${*:-.} do if [[ -d $i ]] then print $i: cd $i ls -CF $( ls ) cd - >/dev/null fi done }
Die for-Schleife arbeitet die Argumente einzeln ab. Haben Sie kein Argument angegeben, wird das aktuelle Verzeichnis (.) für $* gesetzt.
Liegt ein Verzeichnis vor, dann wird dessen Name und Inhalt angezeigt: cd $i wechselt zu dem anzuzeigenden Verzeichnis. $( ls ) wird durch den Inhalt des Verzeichnisses $i ersetzt. ls -CF verzeichnis_inhalt gibt Ihnen die Dateinamen, gefolgt von den Inhalten der Verzeichnisse, mit Markierungen für Zugriffsrechte und Verzeichnisse wieder. Das folgende cd-Kommando wechselt in das Ausgangsverzeichnis (vor dem ersten cd $i).