5 Erste Schritte im Shell-Scripting

5.1 Ausführbare Dateien erstellen

Nachdem wir die grundlegenden Konzepte der Kommandozeileninteraktion kennengelernt haben, ist es an der Zeit, unsere ersten Shell-Skripte zu erstellen. Shell-Scripting ermöglicht es uns, Abfolgen von Befehlen in Dateien zu speichern und diese Befehle automatisiert auszuführen – eine Fähigkeit, die für System-Administratoren und Entwickler gleichermaßen wertvoll ist. In diesem Abschnitt lernen wir Schritt für Schritt, wie man ein einfaches Shell-Skript erstellt, es ausführbar macht und ausführt.

5.1.1 Was ist ein Shell-Skript?

Ein Shell-Skript ist im Wesentlichen eine Textdatei, die eine Sequenz von Befehlen enthält, die von der Shell interpretiert und ausgeführt werden. Diese Befehle könnten Sie genauso gut direkt im Terminal eingeben – aber durch die Speicherung in einer Datei können Sie:

Shell-Skripte sind in ihrer einfachsten Form nichts anderes als Sammlungen von Kommandozeilenbefehlen, die in der Reihenfolge ausgeführt werden, in der sie in der Datei stehen.

5.1.2 Unser erstes Shell-Skript erstellen

Lassen Sie uns ein einfaches “Hello, World!”-Skript erstellen, das klassische erste Programm in jeder Programmiersprache. Dazu benötigen wir einen Texteditor. In der Linux-Welt stehen viele Texteditoren zur Verfügung, darunter nano, vim, gedit oder VS Code. Für Einsteiger ist nano wegen seiner Einfachheit oft die beste Wahl.

Öffnen Sie ein Terminal und geben Sie ein:

nano mein_erstes_skript.sh

Der Editor öffnet sich und Sie können nun Text eingeben. Schreiben Sie folgende Zeilen:

#!/bin/bash

# Mein erstes Shell-Skript
echo "Hello, World!"
echo "Heute ist $(date)"
echo "Mein aktuelles Verzeichnis ist $(pwd)"

Lassen Sie uns diesen Code Zeile für Zeile durchgehen:

  1. #!/bin/bash - Dies ist die sogenannte “Shebang”-Zeile, die wir später genauer erklären werden. Sie teilt dem System mit, welcher Interpreter für dieses Skript verwendet werden soll.
  2. Eine Leerzeile für bessere Lesbarkeit.
  3. # Mein erstes Shell-Skript - Dies ist ein Kommentar. Alles nach dem #-Zeichen wird von der Shell ignoriert und dient nur der Dokumentation.
  4. echo "Hello, World!" - Der Befehl echo gibt Text auf dem Bildschirm aus.
  5. echo "Heute ist $(date)" - Hier nutzen wir Befehlssubstitution, um das aktuelle Datum einzufügen.
  6. echo "Mein aktuelles Verzeichnis ist $(pwd)" - Ähnlich wie oben, aber mit dem aktuellen Arbeitsverzeichnis.

Speichern Sie die Datei in nano, indem Sie Ctrl+O drücken, dann Enter, und verlassen Sie den Editor mit Ctrl+X.

5.1.3 Die Shebang-Zeile verstehen

Die erste Zeile eines Shell-Skripts beginnt üblicherweise mit #!, gefolgt vom Pfad zum Interpreter, der das Skript ausführen soll. Diese spezielle Zeile wird als “Shebang” (manchmal auch “hashbang”) bezeichnet.

#!/bin/bash

Wenn ein Skript mit dieser Zeile beginnt und Sie es direkt ausführen, wird das Betriebssystem automatisch /bin/bash aufrufen und ihm den Inhalt des Skripts zur Interpretation übergeben.

Andere häufige Shebang-Zeilen sind:

Die Shebang-Zeile ist nur relevant, wenn das Skript direkt ausgeführt wird. Wenn Sie das Skript explizit mit einem Interpreter aufrufen (z.B. bash mein_erstes_skript.sh), wird die Shebang-Zeile ignoriert.

5.1.4 Das Skript ausführbar machen

In Unix/Linux-Systemen müssen Dateien explizit als ausführbar markiert werden, bevor sie direkt ausgeführt werden können. Dazu verwenden wir den chmod-Befehl (change mode), der die Zugriffsberechtigungen einer Datei ändert:

chmod +x mein_erstes_skript.sh

Das +x fügt die Ausführungsberechtigung für alle Benutzer hinzu (Eigentümer, Gruppe und andere). Wenn Sie die Ausführung auf bestimmte Benutzer beschränken möchten, können Sie spezifischer sein:

chmod u+x mein_erstes_skript.sh  # Nur für den Eigentümer (user)
chmod g+x mein_erstes_skript.sh  # Nur für die Gruppe (group)
chmod o+x mein_erstes_skript.sh  # Nur für andere Benutzer (others)

Sie können die aktuellen Berechtigungen einer Datei mit dem Befehl ls -l überprüfen:

$ ls -l mein_erstes_skript.sh
-rwxr-xr-x 1 benutzer gruppe 123 Sep 10 15:30 mein_erstes_skript.sh

Die Berechtigungen werden am Anfang der Ausgabe angezeigt: rwx für den Eigentümer (lesen, schreiben, ausführen), r-x für die Gruppe (lesen, ausführen) und r-x für andere (lesen, ausführen).

5.1.5 Das Skript ausführen

Es gibt mehrere Wege, ein Shell-Skript auszuführen:

5.1.5.1 1. Explizit mit einem Interpreter aufrufen:

bash mein_erstes_skript.sh

Diese Methode funktioniert immer, unabhängig von den Ausführungsberechtigungen oder der Shebang-Zeile.

5.1.5.2 2. Direkt ausführen, wenn sich das Skript im aktuellen Verzeichnis befindet:

./mein_erstes_skript.sh

Der ./ teilt der Shell mit, dass sie das Skript im aktuellen Verzeichnis suchen soll. Ohne diesen Präfix würde die Shell nur in den Verzeichnissen suchen, die in der PATH-Umgebungsvariable definiert sind.

5.1.5.3 3. Über den Pfad aufrufen, wenn das Skript im PATH liegt:

Wenn Sie Ihr Skript in ein Verzeichnis verschieben, das im PATH ist (z.B. /usr/local/bin oder ~/bin, sofern konfiguriert), können Sie es direkt aufrufen:

mein_erstes_skript.sh

Dies ist nützlich für Skripte, die Sie regelmäßig von überall im System ausführen möchten.

5.1.6 Ausführungspfade und der PATH

Die PATH-Umgebungsvariable ist eine Liste von Verzeichnissen, die durch Doppelpunkte getrennt sind. Wenn Sie einen Befehl ohne expliziten Pfad eingeben, sucht die Shell in jedem dieser Verzeichnisse nach einer ausführbaren Datei mit diesem Namen.

Sie können den Inhalt Ihres PATH anzeigen mit:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/benutzer/bin

Um ein Verzeichnis für Ihre eigenen Skripte zum PATH hinzuzufügen, können Sie Ihre .bashrc- oder .bash_profile-Datei (für Bash-Benutzer) bearbeiten und folgende Zeile hinzufügen:

export PATH="$HOME/bin:$PATH"

Dies fügt ein Verzeichnis bin in Ihrem Home-Verzeichnis zum Pfad hinzu. Vergessen Sie nicht, das Verzeichnis zu erstellen und Ihre Shell neu zu starten oder die Konfiguration neu zu laden:

mkdir -p ~/bin
source ~/.bashrc  # oder ~/.bash_profile

Jetzt können Sie Ihre Skripte in ~/bin ablegen und sie von überall aufrufen.

5.1.7 Ein etwas komplexeres Beispiel

Lassen Sie uns ein praktischeres Beispiel erstellen: ein Skript, das ein Verzeichnis sichert (backup). Erstellen Sie eine neue Datei namens backup.sh:

nano backup.sh

Und fügen Sie folgenden Inhalt ein:

#!/bin/bash

# Backup-Skript für ein Verzeichnis
# Verwendung: ./backup.sh [Quellverzeichnis]

# Überprüfen, ob ein Verzeichnispfad angegeben wurde
if [ $# -eq 0 ]; then
    echo "Fehler: Kein Verzeichnis angegeben"
    echo "Verwendung: $0 [Quellverzeichnis]"
    exit 1
fi

# Das zu sichernde Verzeichnis
SOURCE_DIR=$1

# Überprüfen, ob das Verzeichnis existiert
if [ ! -d "$SOURCE_DIR" ]; then
    echo "Fehler: Das Verzeichnis '$SOURCE_DIR' existiert nicht."
    exit 1
fi

# Zielverzeichnis für das Backup
BACKUP_DIR=~/backups

# Aktuelles Datum und Zeit für den Dateinamen
DATUM=$(date +%Y-%m-%d_%H-%M-%S)

# Dateiname des Backups
BACKUP_FILE="$BACKUP_DIR/backup_${DATUM}.tar.gz"

# Backupverzeichnis erstellen, falls es nicht existiert
mkdir -p "$BACKUP_DIR"

# Backup erstellen
echo "Erstelle Backup von $SOURCE_DIR..."
tar -czf "$BACKUP_FILE" "$SOURCE_DIR"

# Überprüfen, ob das Backup erfolgreich war
if [ $? -eq 0 ]; then
    echo "Backup erfolgreich erstellt: $BACKUP_FILE"
    # Größe des Backups anzeigen
    du -h "$BACKUP_FILE"
else
    echo "Fehler beim Erstellen des Backups"
    exit 1
fi

Machen Sie das Skript ausführbar:

chmod +x backup.sh

Führen Sie es mit einem Verzeichnis als Argument aus:

./backup.sh ~/Dokumente

Dieses Skript zeigt bereits einige fortgeschrittenere Konzepte, die wir in späteren Kapiteln detaillierter behandeln werden: - Überprüfung von Benutzerargumenten - Verzweigungen mit if-Anweisungen - Verwendung von Variablen für bessere Wartbarkeit - Überprüfung des Exit-Status eines Befehls - Dynamische Generierung von Dateinamen

5.1.8 Skript-Ausführung im Detail

Wenn Sie ein Skript ausführen, geschieht Folgendes:

  1. Kernel-Interpretation der Shebang-Zeile: Wenn Sie ein Skript direkt ausführen (z.B. ./skript.sh), liest der Kernel die Shebang-Zeile und übergibt den Rest der Datei an den angegebenen Interpreter.

  2. Shell wird gestartet: Eine neue Shell-Instanz wird gestartet, um das Skript auszuführen.

  3. Skript wird gelesen: Die Shell liest das Skript Zeile für Zeile.

  4. Befehle werden ausgeführt: Jeder Befehl wird in der angegebenen Reihenfolge ausgeführt, wobei Fehler je nach Skriptlogik behandelt werden.

  5. Exit-Status wird zurückgegeben: Nachdem das Skript abgeschlossen ist, gibt die Shell einen Exit-Status an die aufrufende Shell zurück, normalerweise den Exit-Status des letzten ausgeführten Befehls, sofern nicht explizit mit exit festgelegt.

5.1.9 Allgemeine Probleme beim Ausführen von Shell-Skripten

Hier sind einige häufige Probleme und ihre Lösungen:

  1. “Permission denied”
  2. “Command not found”
  3. “Bad interpreter: No such file or directory”
  4. Fehler im Zusammenhang mit Zeilenendungen (CR+LF vs. LF)
  5. “No such file or directory” trotz existierender Datei

5.1.10 Bewährte Praktiken

Hier sind einige Empfehlungen für Ihre ersten Shell-Skripte:

  1. Beginnen Sie immer mit einer Shebang-Zeile, um die verwendete Shell explizit anzugeben.

  2. Fügen Sie Kommentare hinzu, um den Zweck des Skripts und komplexer Befehle zu erklären.

  3. Wählen Sie aussagekräftige Dateinamen mit der Erweiterung .sh für Shell-Skripte, um ihre Funktion klar zu kommunizieren.

  4. Testen Sie Ihre Skripte in einer kontrollierten Umgebung, bevor Sie sie in Produktionsumgebungen einsetzen.

  5. Behandeln Sie Fehlerfälle, insbesondere wenn das Skript mit sensiblen Daten oder Systemressourcen arbeitet.

  6. Fügen Sie Nutzungsinformationen hinzu, besonders für Skripte, die Parameter akzeptieren oder von anderen Benutzern verwendet werden könnten.

5.2 Praxisbeispiel: Erstellung und Ausführung eines einfachen “Hello World”-Skripts

In diesem Praxisbeispiel werden wir Schritt für Schritt ein klassisches “Hello World”-Skript erstellen und ausführen. Dieses einfache Beispiel wird Ihnen die grundlegenden Elemente des Shell-Scriptings vermitteln und als Sprungbrett für komplexere Skripte dienen. Wir werden die einzelnen Schritte detailliert erläutern, sodass Sie auch ohne Vorkenntnisse folgen können.

5.2.1 Schritt 1: Erstellen der Skriptdatei

Beginnen wir mit dem Erstellen einer neuen Textdatei. Öffnen Sie dazu ein Terminal und navigieren Sie zu einem Verzeichnis Ihrer Wahl, in dem Sie die Datei erstellen möchten. Für dieses Beispiel verwenden wir das Home-Verzeichnis:

cd ~

Nun erstellen wir die Skriptdatei mit einem Texteditor. In diesem Beispiel verwenden wir nano, einen benutzerfreundlichen Editor, der auf den meisten Linux-Systemen vorinstalliert ist:

nano hello_world.sh

Dieser Befehl öffnet den nano-Editor mit einer neuen oder bestehenden Datei namens hello_world.sh. Die Endung .sh ist nicht zwingend erforderlich, hat sich aber als Konvention für Shell-Skripte etabliert und erleichtert die Identifizierung.

5.2.2 Schritt 2: Verfassen des Skripts

In den geöffneten Editor geben Sie nun folgenden Code ein:

#!/bin/bash

# Mein erstes Shell-Skript
# Autor: Ihr Name
# Datum: Aktuelles Datum

echo "Hello, World!"
echo "Heute ist $(date)"
echo "Ich bin eingeloggt als $(whoami)"
echo "Willkommen in meinem ersten Shell-Skript!"

Lassen Sie uns diesen Code im Detail betrachten:

  1. Shebang-Zeile (#!/bin/bash): Diese erste Zeile teilt dem System mit, welcher Interpreter für die Ausführung des Skripts verwendet werden soll. In diesem Fall ist es die Bash-Shell, die sich üblicherweise unter /bin/bash befindet.

  2. Kommentare (Zeilen, die mit # beginnen): Diese Zeilen werden von der Shell ignoriert und dienen nur der Dokumentation. Es ist eine gute Praxis, zumindest grundlegende Informationen wie den Zweck des Skripts, den Autor und das Erstellungsdatum anzugeben.

  3. echo-Befehle: Diese geben Text auf dem Bildschirm aus.

  4. Befehlssubstitution ($(...)): Mit dieser Syntax können wir die Ausgabe eines Befehls in einen String einbetten. In unserem Beispiel:

Drücken Sie nach der Eingabe des Codes Ctrl+O (speichern), dann Enter (Dateinamen bestätigen) und schließlich Ctrl+X (Editor verlassen).

5.2.3 Schritt 3: Ausführbar machen des Skripts

In Unix/Linux-Systemen muss eine Datei explizit als ausführbar markiert werden, bevor sie direkt ausgeführt werden kann. Dies geschieht mit dem chmod-Befehl (change mode):

chmod +x hello_world.sh

Das +x fügt die Ausführungsberechtigung zu den bestehenden Berechtigungen hinzu. Sie können überprüfen, ob die Berechtigung korrekt gesetzt wurde, indem Sie den folgenden Befehl ausführen:

ls -l hello_world.sh

Die Ausgabe sollte ähnlich wie folgt aussehen:

-rwxr-xr-x 1 benutzer gruppe 157 Sep 15 14:30 hello_world.sh

Die Zeichenfolge am Anfang zeigt die Berechtigungen an. Das x (drei davon in diesem Fall) steht für “ausführbar” (executable). Die drei Berechtigungsgruppen stehen für den Eigentümer, die Gruppe und alle anderen Benutzer.

5.2.4 Schritt 4: Ausführen des Skripts

Nun können wir unser Skript auf verschiedene Arten ausführen:

5.2.4.1 a) Direkte Ausführung mit relativem Pfad:

./hello_world.sh

Der ./ gibt an, dass die Datei im aktuellen Verzeichnis gesucht werden soll. Die Shell würde sonst nur in den Verzeichnissen suchen, die in der PATH-Umgebungsvariable definiert sind.

5.2.4.2 b) Explizite Ausführung mit dem Bash-Interpreter:

bash hello_world.sh

Diese Methode funktioniert auch, wenn die Datei nicht als ausführbar markiert ist.

5.2.5 Schritt 5: Beobachten der Ausgabe

Nach der Ausführung des Skripts sollten Sie eine Ausgabe ähnlich der folgenden sehen:

Hello, World!
Heute ist Di 15. Sep 2024 14:35:42 CEST
Ich bin eingeloggt als benutzer
Willkommen in meinem ersten Shell-Skript!

Die genaue Ausgabe variiert je nach Datum, Uhrzeit und Benutzernamen.

5.2.6 Schritt 6: Ändern und Erweitern des Skripts

Nun, da wir ein funktionierendes Skript haben, können wir es erweitern. Öffnen Sie die Datei erneut im Editor:

nano hello_world.sh

Und fügen Sie am Ende folgende Zeilen hinzu:

# Systeminformationen anzeigen
echo -e "\nEinige Systeminformationen:"
echo "------------------------"
echo "Betriebssystem: $(uname -s)"
echo "Kernel-Version: $(uname -r)"
echo "Hostname: $(hostname)"
echo "CPU-Informationen: $(grep "model name" /proc/cpuinfo | head -n 1 | cut -d ":" -f 2 | sed 's/^[ \t]*//')"
echo "Verfügbarer Speicher: $(free -h | grep Mem | awk '{print $4}')"

Diese Erweiterung zeigt, wie wir verschiedene Systembefehle kombinieren können, um nützliche Informationen anzuzeigen:

Speichern Sie die Datei und führen Sie das Skript erneut aus:

./hello_world.sh

Die erweiterte Ausgabe sollte nun auch die Systeminformationen enthalten.

5.2.7 Schritt 7: Parametrisierung des Skripts

Als nächstes machen wir unser Skript flexibler, indem wir Parameter hinzufügen. Bearbeiten Sie das Skript erneut:

nano hello_world.sh

Und modifizieren Sie es wie folgt:

#!/bin/bash

# Erweitertes Hello-World-Skript
# Autor: Ihr Name
# Datum: Aktuelles Datum

# Prüfen, ob ein Name als Parameter übergeben wurde
if [ $# -eq 0 ]; then
    # Kein Parameter angegeben, Standard-Benutzer verwenden
    USER_NAME=$(whoami)
else
    # Parameter verwenden
    USER_NAME=$1
fi

echo "Hello, $USER_NAME!"
echo "Heute ist $(date)"
echo "Ich bin eingeloggt als $(whoami)"
echo "Willkommen in meinem ersten Shell-Skript!"

# Systeminformationen nur anzeigen, wenn -s oder --system als zweiter Parameter angegeben wurde
if [ "$2" = "-s" ] || [ "$2" = "--system" ]; then
    echo -e "\nEinige Systeminformationen:"
    echo "------------------------"
    echo "Betriebssystem: $(uname -s)"
    echo "Kernel-Version: $(uname -r)"
    echo "Hostname: $(hostname)"
    echo "CPU-Informationen: $(grep "model name" /proc/cpuinfo | head -n 1 | cut -d ":" -f 2 | sed 's/^[ \t]*//')"
    echo "Verfügbarer Speicher: $(free -h | grep Mem | awk '{print $4}')"
fi

echo -e "\nSkript wurde ausgeführt am $(date +"%d.%m.%Y um %H:%M:%S")"

In dieser erweiterten Version haben wir:

  1. Eine Überprüfung hinzugefügt, ob Parameter übergeben wurden ($# ist die Anzahl der Parameter)
  2. Den ersten Parameter als Benutzernamen verwendet ($1 ist der erste Parameter)
  3. Eine Bedingung hinzugefügt, die Systeminformationen nur anzeigt, wenn -s oder --system als zweiter Parameter angegeben wurde
  4. Eine Abschlusszeile mit formatiertem Datum hinzugefügt

Speichern Sie die Datei und testen Sie die verschiedenen Ausführungsarten:

# Standard-Ausführung ohne Parameter
./hello_world.sh

# Mit Benutzernamen
./hello_world.sh "Max Mustermann"

# Mit Benutzernamen und Anzeige der Systeminformationen
./hello_world.sh "Max Mustermann" --system

# Nur Systeminformationen mit Standard-Benutzernamen
./hello_world.sh "" -s

5.2.8 In a Nutshell

In diesem Praxisbeispiel haben Sie gelernt:

  1. Wie man eine Skriptdatei erstellt und mit einem Editor bearbeitet
  2. Die Bedeutung der Shebang-Zeile und Kommentare
  3. Wie man grundlegende Befehle und Befehlssubstitution in einem Skript verwendet
  4. Wie man eine Datei ausführbar macht
  5. Verschiedene Methoden, ein Skript auszuführen
  6. Wie man ein Skript erweitert, um mehr Funktionalität hinzuzufügen
  7. Wie man Benutzereingaben durch Parameter verarbeitet
  8. Wie man bedingte Ausführung mit if-Anweisungen implementiert

Dieses einfache “Hello World”-Beispiel bildet die Grundlage für komplexere Skripte, die wir in den folgenden Kapiteln entwickeln werden. Es demonstriert bereits viele grundlegende Konzepte des Shell-Scriptings, die in praktisch jedem Skript zum Einsatz kommen.

5.3 Übung: Einrichten einer personalisierten Shell-Umgebung

Eine effiziente und angenehme Arbeit mit der Shell hängt maßgeblich von einer gut konfigurierten Umgebung ab. In dieser Übung werden Sie Ihre eigene Shell-Umgebung personalisieren, indem Sie benutzerdefinierte Einstellungen, Aliase und Funktionen erstellen. Dies wird nicht nur Ihre Produktivität steigern, sondern Ihnen auch ein tieferes Verständnis der Shell-Konfiguration vermitteln.

5.3.1 Lernziele

5.3.2 Voraussetzungen

5.3.3 Teil 1: Verstehen der Konfigurationsdateien

Bevor wir Änderungen vornehmen, sollten wir verstehen, welche Dateien die Shell beim Start lädt. Führen Sie die folgenden Befehle aus, um diese Dateien zu identifizieren und zu untersuchen:

# Anzeigen der globalen Bash-Konfigurationsdateien
ls -la /etc/bash.bashrc /etc/profile 2>/dev/null
ls -la /etc/profile.d/ 2>/dev/null

# Anzeigen der benutzerspezifischen Konfigurationsdateien
ls -la ~/.bash_profile ~/.bashrc ~/.profile ~/.bash_logout 2>/dev/null

Hinweis: Die genauen Dateinamen und -pfade können je nach Distribution variieren.

Die wichtigsten Dateien für unsere Übung sind:

Erstellen Sie Sicherungskopien dieser Dateien, bevor Sie Änderungen vornehmen:

cp ~/.bashrc ~/.bashrc.bak
cp ~/.bash_profile ~/.bash_profile.bak 2>/dev/null
cp ~/.profile ~/.profile.bak 2>/dev/null

5.3.4 Teil 2: Einrichten eines persönlichen Bin-Verzeichnisses

Ein eigenes Bin-Verzeichnis ist ideal für persönliche Skripte, die Sie von überall aufrufen möchten.

  1. Erstellen Sie das Verzeichnis:
mkdir -p ~/bin
  1. Fügen Sie es zum PATH hinzu, indem Sie Ihre ~/.bashrc bearbeiten:
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
  1. Laden Sie die aktualisierte Konfiguration:
source ~/.bashrc
  1. Erstellen Sie ein Test-Skript, um zu überprüfen, ob alles funktioniert:
# Skript erstellen
nano ~/bin/hello

# Folgenden Inhalt einfügen:
#!/bin/bash
echo "Hello from your personal script!"

# Ausführbar machen
chmod +x ~/bin/hello
  1. Testen Sie, ob das Skript von überall aufgerufen werden kann:
cd /tmp
hello

Wenn “Hello from your personal script!” angezeigt wird, wurde das Bin-Verzeichnis erfolgreich eingerichtet.

5.3.5 Teil 3: Nützliche Aliase erstellen

Aliase sind Abkürzungen für längere oder häufig verwendete Befehle. Erstellen Sie eine separate Datei für Ihre Aliase:

# Datei erstellen
nano ~/.bash_aliases

# Folgende Aliase einfügen:
# Navigation
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias .3='cd ../../..'
alias .4='cd ../../../..'

# Sicherheit
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Netzwerk
alias myip='curl -s ifconfig.me'
alias ports='netstat -tulanp'

# Systeminfo
alias meminfo='free -m -l -t'
alias cpuinfo='lscpu'
alias diskspace='df -h'

# Git (falls installiert)
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'

Aktivieren Sie diese Aliase, indem Sie Ihre ~/.bashrc bearbeiten:

echo '
# Alias-Definitionen
if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
' >> ~/.bashrc

Laden Sie die aktualisierte Konfiguration:

source ~/.bashrc

Testen Sie einige der Aliase, z.B. ll, .. oder myip.

5.3.6 Teil 4: Nützliche Shell-Funktionen implementieren

Für komplexere Aufgaben sind Funktionen leistungsfähiger als Aliase. Erstellen Sie eine Datei für Ihre Funktionen:

# Datei erstellen
nano ~/.bash_functions

# Folgende Funktionen einfügen:
# Verzeichnis erstellen und hineinwechseln
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# Schnelle Suche in Dateien
ftext() {
    grep -r "$1" .
}

# Archiv extrahieren (unterstützt verschiedene Formate)
extract() {
    if [ -f "$1" ] ; then
        case "$1" in
            *.tar.bz2)   tar xjf "$1"     ;;
            *.tar.gz)    tar xzf "$1"     ;;
            *.bz2)       bunzip2 "$1"     ;;
            *.rar)       unrar e "$1"     ;;
            *.gz)        gunzip "$1"      ;;
            *.tar)       tar xf "$1"      ;;
            *.tbz2)      tar xjf "$1"     ;;
            *.tgz)       tar xzf "$1"     ;;
            *.zip)       unzip "$1"       ;;
            *.Z)         uncompress "$1"  ;;
            *.7z)        7z x "$1"        ;;
            *)           echo "'$1' kann nicht extrahiert werden" ;;
        esac
    else
        echo "'$1' ist keine gültige Datei"
    fi
}

# Backup-Funktion
backup() {
    if [ -z "$1" ]; then
        echo "Verwendung: backup <datei/verzeichnis>"
        return 1
    fi
    
    timestamp=$(date +%Y%m%d_%H%M%S)
    cp -r "$1" "$1"_backup_"$timestamp"
    echo "Backup erstellt: $1_backup_$timestamp"
}

Aktivieren Sie diese Funktionen in Ihrer ~/.bashrc:

echo '
# Funktionsdefinitionen
if [ -f ~/.bash_functions ]; then
    . ~/.bash_functions
fi
' >> ~/.bashrc

Laden Sie die aktualisierte Konfiguration:

source ~/.bashrc

Testen Sie die Funktionen, z.B. mkcd test_dir, backup wichtige_datei.txt oder extract archiv.tar.gz (falls vorhanden).

5.3.7 Teil 5: Anpassen des Shell-Prompts

Der Shell-Prompt (PS1) kann angepasst werden, um nützliche Informationen anzuzeigen und optisch ansprechender zu sein.

# Sichern des aktuellen Prompts
echo "# Original PS1: $PS1" >> ~/.bashrc

# Anpassen des Prompts
echo '
# Angepasster Prompt
PS1="\[\033[38;5;11m\]\u\[\033[0m\]@\[\033[38;5;39m\]\h\[\033[0m\]:\[\033[38;5;76m\]\w\[\033[0m\]\$ "
' >> ~/.bashrc

Diese Einstellung färbt den Benutzernamen gelb, den Hostnamen blau und den aktuellen Pfad grün.

Für fortgeschrittene Benutzer, die Git verwenden, hier ein Prompt, der den Git-Branch anzeigt:

echo '
# Git-Status im Prompt anzeigen (wenn git installiert ist)
if command -v git &>/dev/null; then
    parse_git_branch() {
        git branch 2> /dev/null | sed -e "/^[^*]/d" -e "s/* \(.*\)/ (\1)/"
    }
    PS1="\[\033[38;5;11m\]\u\[\033[0m\]@\[\033[38;5;39m\]\h\[\033[0m\]:\[\033[38;5;76m\]\w\[\033[38;5;214m\]\$(parse_git_branch)\[\033[0m\]\$ "
fi
' >> ~/.bashrc

Laden Sie die aktualisierte Konfiguration:

source ~/.bashrc

5.3.8 Teil 6: Umgebungsvariablen konfigurieren

Umgebungsvariablen beeinflussen das Verhalten von Programmen und der Shell selbst.

echo '
# Historieneinstellungen
export HISTSIZE=10000       # Anzahl der Befehle im Speicher
export HISTFILESIZE=10000   # Anzahl der gespeicherten Befehle
export HISTCONTROL=ignoreboth:erasedups  # Keine Duplikate speichern

# Bevorzugte Programme
export EDITOR=nano          # Standard-Editor
export VISUAL=nano          # Visueller Editor
export PAGER=less           # Pager für lange Ausgaben

# Lokalisierung
export LANG=de_DE.UTF-8     # Deutsche Lokalisierung mit UTF-8
export LC_ALL=de_DE.UTF-8   # Konsistente Lokalisierung

# Farbige Ausgaben für ls und grep
export LS_COLORS="di=1;34:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43"
export GREP_OPTIONS="--color=auto"
' >> ~/.bashrc

Passen Sie die Werte nach Bedarf an (z.B. den Wert für EDITOR oder die Lokalisierung).

5.3.9 Teil 7: Abschließende Anpassungen und Tests

Jetzt ist es Zeit, alle Änderungen zu laden und zu testen:

source ~/.bashrc

Überprüfen Sie, ob alle Funktionen wie erwartet arbeiten: - Testen Sie Ihre Aliase und Funktionen - Überprüfen Sie, ob der Prompt wie gewünscht aussieht - Stellen Sie sicher, dass das Bin-Verzeichnis funktioniert

5.3.10 Aufgaben zur Erweiterung

  1. Erweitern Sie Ihre .bash_aliases-Datei um mindestens fünf eigene Aliase, die auf Ihre häufigsten Befehle zugeschnitten sind.

  2. Erstellen Sie eine neue Shell-Funktion namens weather, die das aktuelle Wetter für Ihren Standort anzeigt (Tipp: Nutzen Sie curl mit einem Wetter-Dienst wie wttr.in: curl wttr.in/Berlin).

  3. Personalisieren Sie Ihren Prompt weiter, indem Sie eine Funktion hinzufügen, die die aktuelle Zeit anzeigt.

  4. Erstellen Sie ein “Welcome”-Skript in Ihrem Bin-Verzeichnis, das beim Öffnen eines neuen Terminals automatisch ausgeführt wird und nützliche Systeminformationen anzeigt.

  5. Richten Sie Tab-Vervollständigung für Ihre eigenen Skripte ein, indem Sie eine entsprechende Completion-Datei erstellen und einbinden.

5.3.11 Erfolgskriterien

Sie haben die Übung erfolgreich abgeschlossen, wenn Sie:

  1. Ein funktionierendes persönliches Bin-Verzeichnis eingerichtet haben
  2. Mindestens zehn nützliche Aliase definiert haben
  3. Mindestens vier Shell-Funktionen implementiert haben
  4. Einen personalisierten Prompt konfiguriert haben
  5. Relevante Umgebungsvariablen angepasst haben
  6. Alle Änderungen getestet und verifiziert haben

5.3.12 Hinweise und Tipps

5.3.13 Fehlerbehebung