Anpassung und Benutzung Shell-Umgebung

Wichtung: 5

Beschreibung: Die Kandidaten sollen in der Lage sein, Shell-Umgebungsvariablen an die Bedürfnisse der Benutzer anzupassen.

Wichtigste Wissensgebiete:
Setzen von Umgebungsvariablen (z.B. PATH) beim Login oder beim Starten neuer Shells (Spawning).
Schreiben von BASH-Funktionen für häufig genutzte Befehlsfolgen.

Liste wichtiger Dateien, Verzeichnisse und Anwendungen:
Interne BASH-Funktionen und -Befehle
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
~/.bash_logout
~/.inputrc
function
export
env
set
lists
seq
unset

Prinzip Login- und NoLogin-Shell

Grundsätzlich benötigt jede Shell eine Konfiguration, in der beispielsweise festgelegt wird, wie die Zeichen auszusehen haben oder welche Umgebungsvariablen verfügbar sind. Damit nicht jede Shell diese Konfiguration bei jedem Aufruf abarbeitet, gibt es eine so genannte Login-Shell. Alle weiteren Shells sind in der Regel Subshells dieser Login-Shell und werden als NoLogin-Shell bezeichnet.

Wann werden Subshells aufgerufen? Wenn beispielsweise eine Shell ein Skript abarbeitet, werden Subshells aufgerufen. Davon bekommt der Anwender aber nichts mit. Deutlich wird es, wenn man die graphische Benutzeroberfläche startet: dieses wird durch den Befehl startx in der Shell erledigt. Starten wir dann Xterm, handelt es sich um eine Subshell.

Shell-Variablen - Gültigkeit?

Es entstehen nun Probleme bezüglich der Gültigkeit von Shellvariablen, da die Subshells nicht die Konfiguration der Login-Shell abarbeiten und die Subshells die Konfiguration der "Mutter-Shell" erhalten. Wenn wir eine Variable in der Shell 01 definieren, ist diese erst einmal nicht der Shell 02 bekannt:

  //SHELL 01
# Var1=Hallo
# echo $Var1
Hallo

//SHELL 02
$ echo $Var1

Damit eine Shell eine Variable an ihre Subshells weitergibt, muss die Variable exportiert werden. Das geschieht mit dem Shellbefehl export. Damit steht eine Variable allen weiteren Subshells zur Verfügung:

  //SHELL 01
# export Var1=Hallo
# echo $Var1
Hallo

//SHELL 02
# echo $Var1
Hallo

Achtung: Ändert man eine Variable, die zuvor exportiert wurde, so bezieht sich die Änderung nur auf die Subshell!

Zwang, keine Subshell aufzurufen

Man kann eine Shell auch dazu zwingen, wenn ein Skript ausgeführt wird, keine weiteren Subshells aufzurufen. Die jeweilige Shell muss dementsprechend das Skript selbst abarbeiten, so dass bei der Programmierung nicht auf das Exportieren von Variablen geachtet werden muss. Dieses erreicht man mittels des Punkts:

# ./hdd_sync.sh

Alias definieren

Ein Alias ist dann nützlich, wenn man bestimmte Befehle und Funktionsaufrufe regelmäig anwendet. Hier kann man einen Alias setzen, der diesen Befehl dann quasi "übersetzt":

alias ls="ls -lsh"

In diesem Fall wird der Verzeichnis-Inhalt mit Angabe zu der Dateigröße (-s), welche für Menschen lesbar (-h) ist, aufgelistet (-l), wenn man ls in der Shell eintippt. Mit dem Befehl unalias wird ein Alias wieder gelöscht.

Aliase haben nur Gültigkeit in der jeweiligen Shell. Sie lassen sich nicht exportieren.

Funktionen definieren

Shellfunktionen haben nahezu dieselbe Funktion wie in anderen Programmiersprachen. Ein Funktion innerhalb eines Programms wird dazu gebraucht, immer wiederkehrende Aufgaben zu separieren, um diese durch einen einfachen Befehlsaufruf zu nutzen. So muss man Teile des Programmcodes nur an einer einzigen Stelle definieren, ohne diesen mehrfach zu schreiben.

Die Syntax einer Shellfunktion lautet:

  function Name_Der_Funktion ()
{
Anweisung
}

Auch einer Shellfunktion können Parameter übergeben werden. Diese werden aber nicht im Funktionskopf vordefiniert, sondern im Funktionsrumpf:

$1 = Erster übergebener Parameter
$2 = Zeiter übergebener Parameter
...usw...

$*, $@ und $# = beziehen sich auf die Parameter der Funktion

In folgendem Beispiel wird der Inhalt eines Verzeichnisses gelöscht und gleichzeitig der leer Inhalt angezeigt:

function delShow ()
{
cd $*
rm -R *
ls -la
}

wenn man nun in der Shell delShow /home/test eintippt, wird die Funktion delShow aufgerufen. Es wird dann in das angegebene Verzeichnis ($* = Parameter) gewechselt, anschließend werden alle Dateien und Verzeichnisse gelöscht. Zu guter letzt wird zur Bestätigung das leere Verzeichnis ausgegeben.

Was passiert, wenn eine Funktion denselben Namen hat wie ein Linux-Befehl? Es entsteht eine Endlosschleife, welche den Rechner ggf. zum Absturz bringt. Hierfür kann man builtin vor den Befehl setzen.

function ls()
{
builtin ls
}

Dann ist bekannt, dass es sich bei ls nicht um die Funktion, sondern um ein Programm handelt.

Konfigurationsdateien der shell

Es gibt mehrere Konfigurationsdateien für die shell, die nach und nach abgearbeitet werden:

/etc/profile = Wird zuerst abgearbeitet, allgemeine System-Konfigurationsdatei
.bash_profile = Wird anschließend abgearbeitet, Benutzerspezifisch
.profile = Wird anschließend abgearbeitet, Benutzerspezifisch

Umgebungsvariablen bearbeiten

echo $PATH = Zeigt die Umgebungsvariable $PATH an
PATH=/home/bin = Der Variable PATH den Wert /home/bin zuweisen
PATH=$PATH:/home/bin = Die Variable PATH mit dem Eintrag /home/bin erweitern
export VARIABLE = Die Variable steht nicht nur in der aktuellen Shell, sondern auch in den von Ihr aufgerufenen Programmen zur Verfügung.
export VARIABLE=abc = Dasselbe wie zuvor, nur mit Wertzuweisung.

Wichtig: Variablen, die mit export bekannt gemacht wurden, verschwinden nach einem Neustart wieder!

set = Zeigt ALLE definierten Variablen an.
unset PATH = Entfernt die Werte aus dem Umgebungsspeicher. Variable wird geleert.
env = Zeigt ALLE Umgebungsvariablen an.
pwd = Zeigt aktuelles Arbeitsverzeichnis an (print working directory)

Weitere Quellen

Linux-User.de