Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

tux:shell_function [2012/11/18 19:44]
wikisysop
tux:shell_function [2012/11/20 08:56] (aktuell)
wikisysop
Zeile 1: Zeile 1:
 [[:tux|{{ :​linux.png?​40|}}]] [[:tux|{{ :​linux.png?​40|}}]]
 =====(Bash) Shell-Funktionen===== =====(Bash) Shell-Funktionen=====
 +FIXME
 In >><​fc #​008000>​Shell-Funktionen</​fc><<​ können wie in >><​fc #​008000>​Shell-Skripte</​fc><<​ bestimmte Arbeitsabläufe zusammengefasst werden und durch das Ausführen der Funktion oder des Skripts abgerufen werden. So können zB häufig wiederkehrende Aufgaben in einem Skript einmalig als Funktion definiert werden und beliebig oft an beliebigen Stellen im Skript aufgerufen werden. Das spart Code und wirkt sich positiv auf die Lesbarkeit des Skripts aus. >><​fc #​008000>​Shell-Funktionen</​fc><<​ können aber auch außerhalb eines Skripts in einer Shell erstellt und verwendet werden. In >><​fc #​008000>​Shell-Funktionen</​fc><<​ können wie in >><​fc #​008000>​Shell-Skripte</​fc><<​ bestimmte Arbeitsabläufe zusammengefasst werden und durch das Ausführen der Funktion oder des Skripts abgerufen werden. So können zB häufig wiederkehrende Aufgaben in einem Skript einmalig als Funktion definiert werden und beliebig oft an beliebigen Stellen im Skript aufgerufen werden. Das spart Code und wirkt sich positiv auf die Lesbarkeit des Skripts aus. >><​fc #​008000>​Shell-Funktionen</​fc><<​ können aber auch außerhalb eines Skripts in einer Shell erstellt und verwendet werden.
  
Zeile 19: Zeile 19:
  
 Das allein nutzt aber nichts, wenn Sie das System neu starten bzw. wenn Sie eine neue Shell starten. Um diese Funktion auch nach einem Neustart des Systems zur Verfügung zu haben, können Sie die Funktions-Definition in den Shell [[:​tux:​profile|Konfigurationsdateien]] (zB >><​fc #​008000>​.profile</​fc><<​) plazieren. Das allein nutzt aber nichts, wenn Sie das System neu starten bzw. wenn Sie eine neue Shell starten. Um diese Funktion auch nach einem Neustart des Systems zur Verfügung zu haben, können Sie die Funktions-Definition in den Shell [[:​tux:​profile|Konfigurationsdateien]] (zB >><​fc #​008000>​.profile</​fc><<​) plazieren.
 +
 +Definieren Sie einen Shell-Funktions-Namen welcher bereits durch ein vorhandenes Programm belegt ist, führt dies nicht zu einer Fehlermeldung,​ denn beides ist möglich. Es wird jedoch in der laufenden Shell zuerst der Name der Funktion aufgelöst, dass andere Programm ist in dieser Session nicht mehr verfügbar bzw kann nur noch mit absoluten Pfad ausgeführt werden.
  
 ====Performance==== ====Performance====
Zeile 26: Zeile 28:
  
 ====Variablen==== ====Variablen====
-Da eine >><​fc #​008000>​Shell-Funktion</​fc><<​ keine Sub-Shell aufruft, sondern in der Umgebung der >><​fc #​008000>​Parent-Shell</​fc><<​ ausgeführt wird, kann diese auch auf Variablen zugreifen und diese verändern, die innerhalb der >><​fc #​008000>​Parent-Shell</​fc><<​ definiert wurden; oder globale Variablen (Umgebungsvariablen) verändern, welche innerhalb dieses >><​fc #​008000>​Shell-Prozesses</​fc><<​ ihre Gültigkeit nicht verlieren. Anders ausgedrückt,​ eine in einer >><​fc #​008000>​Shell-Funktion</​fc><<​ deklarierten Variable behält nach Ablauf der Funktion ihre Gültigkeit. Eine in einem >><​fc #​008000>​Shell-Skript</​fc><<​ deklarierte Variable verliert idR nach Ablauf des Skripts ihre Gültigkeit.+Da eine >><​fc #​008000>​Shell-Funktion</​fc><<​ keine Sub-Shell aufruft, sondern in der Umgebung der >><​fc #​008000>​Parent-Shell</​fc><<​ ausgeführt wird, kann diese auch auf deren Umgebungs-Variablen zugreifen und diese verändern. Anders ausgedrückt,​ eine in einer >><​fc #​008000>​Shell-Funktion</​fc><<​ deklarierten Variable behält nach Ablauf der Funktion ihre Gültigkeit. Eine in einem >><​fc #​008000>​Shell-Skript</​fc><<​ deklarierte Variable verliert idR nach Ablauf des Skripts ihre Gültigkeit.
  
 Ein Beispiel: Ein Beispiel:
Zeile 53: Zeile 55:
 Wie Sie sehen, sehen Sie nichts... Wie Sie sehen, sehen Sie nichts...
  
-Kürzlich stand ich vor einer Aufgabe etwas komplexere Löschoperationen zu testen und habe mir dafür ein Testverzeichnis mit diversen Unterverzeichnissen und Dateien erstellt. Um immer wieder auf diesen Stand zurückzukehren habe ich mir das oberste Verzeichnis dieser Struktur als Tarball gesichert und konnte ​nun jedes mal, wenn ich die Löschoperation erneut an der gesamten Struktur testen wollte das Testverzeichnis löschen und anschließend den Tarball entpacken. Danach hatte ich wieder das Testverzeichnis mit dem gesamten ursprünglichen Inhalt. Soweit so gut aber ich musste nun nach jeder Löschoperation aus dem Verzeichnis wechseln, das Testverzeichnis löschen, den Tarball entpacken und wieder ​in das Testverzeichnis wechseln. Recht umständlich,​ dass sollte einfacher gehen...+Umgekehrt kann nun eine Variable ​in einer Funktion deklariert werden:
  
-Dabei bin ich auf die Möglichkeit gestoßen sich temporäre Shell-Funktionen anzulegen, welche durch den Aufruf der Funktion eine Abfolge konfigurierter Kommandos ausführt. Eine Funktion wird wie folgt erstellt:+<​xterm>​$ <fc #​008000>​setvar()</​fc>​  
 +{  
 +    bar=foo 
 +}</​xterm>​
  
-<​xterm>#​ <fc #​008000>​rebuild ()</​fc>​ +Und nach dem Ausführen auch außerhalb der Funktion darauf zugegriffen werden:
-></​xterm>​+
  
-Dadurch springt der Cursor in einen Editormodus,​ wo nun die Abfolge der Kommandos eingetragen werden können. Es empfiehlt sich die Funktion in geschweifte Klammern zu setzen, was aber bei nur einem Kommando nicht notwendig ist:+<​xterm>​$ <fc #​008000>​setvar</​fc>​ 
 +$ <fc #​008000>​echo $bar</​fc>​ 
 +foo</​xterm>​
  
-<​xterm>#​ <fc #​008000>​rebuild ()</​fc>​ +====Beispiel==== 
-> <fc #​008000>​{</​fc>​ +Kürzlich stand ich vor einer Aufgabe etwas komplexere Löschoperationen zu testen und habe mir dafür ein Testverzeichnis mit diversen Unterverzeichnissen und Dateien erstellt. Um immer wieder auf diesen Stand zurückzukehren habe ich mir das oberste Verzeichnis dieser Struktur als Tarball gesichert und konnte nun jedes mal, wenn ich die Löschoperation erneut an der gesamten Struktur testen wollte, dass Testverzeichnis löschen und anschließend den Tarball entpacken. Danach hatte ich wieder das Testverzeichnis mit dem gesamten ursprünglichen Inhalt. Soweit so gut aber ich musste nun nach jeder Löschoperation aus dem Verzeichnis wechseln, das Testverzeichnis löschen, den Tarball entpacken und wieder in das Testverzeichnis wechseln. Recht umständlich,​ dass sollte einfacher gehen...
-> <fc #​008000>​cd ​..</​fc>​ +
-> <fc #​008000>​rm -rf master/</​fc>​ +
-> <fc #​008000>​tar -xvf master.tar</​fc>​ +
-> <fc #​008000>​cd master</​fc>​ +
-> <fc #​008000>​tree</​fc>​ +
-> <fc #​008000>​}</​fc></​xterm>​+
  
-Mit dem type-Kommando können Sie den Inhalt der Funktion ​überprüfen:+Folgende ​Funktion ​hat nun den gesamten Vorgang automatisiert:
  
-<​xterm>#​ <fc #008000>type rebuild</​fc>​ +<​xterm>#​ <fc #​008000>​rebuild()</​fc> ​
-rebuild ist eine Funktion. +
-rebuild () +
  
     cd ..;     cd ..;
Zeile 83: Zeile 81:
     tree     tree
 }</​xterm>​ }</​xterm>​
- 
-Sie können diese Funktion nun einfach durch die Angabe des Namens aufrufen: 
- 
-<​xterm>#​ <fc #​008000>​rebuild</​fc></​xterm>​ 
- 
- 
  
  --- //pronto 2012/11/09 10:50//  --- //pronto 2012/11/09 10:50//
 {{keywords>​linux shell function ()}} {{keywords>​linux shell function ()}}
tux/shell_function.1353264292.txt.gz (8462 views) · Zuletzt geändert: 2012/11/18 19:44 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0