Bäumchen wechsle Dich

Schneller Verzeichniswechsel

01.06.2003 Jeder Shell-Anwender benutzt das Kommando "cd". Die IBM-Linux-Variante zLinux bietet die Möglichkeit, cd mit zwei Argumenten aufzurufen. Wie Sie damit viel Tipparbeit sparen und den erweiterten Befehl auch auf Ihrem Linux-System verwenden können, zeigt dieser Artikel.

Wer kennt nicht das Problem, dass sich nach einiger Zeit produktiver Arbeit vor dem Computer etliche Dateien im Home-Verzeichnis gesammelt haben? Ist der Punkt erreicht, an dem die Eingabe von ls eine so lange Liste von Dateien auf die Konsole schreibt, dass diese aus dem sichtbaren Bereich des Terminals heraus scrollt, muss man sich schon mit ls *more oder spezielleren Wildcards behelfen. Dann wird es nötig, die Datenflut in Verzeichnissen zu ordnen. Der Kreativität sind keine Grenzen gesetzt, und schnell erstellt man sich die Unterverzeichnisse Bilder, Schriftverkehr, Urlaub, Geschenkideen etc.

Entscheidungen treffen

Schließlich kommt der Tag, an dem man seine Urlaubsfotos abspeichern möchte. Aber wohin soll man sie nun stecken? Schließlich gibt es extra einen Ordner Bilder aber auch einen Ordner Urlaub, in dem man schon alle HTML-Seiten der letzten Urlaubsplanung und die eingescannten Vouchers und Verträge des Reiseveranstalters liegen. Doch halt, gab es da nicht auch einen Ordner Schriftverkehr? Fazit: Je ordentlicher man seine Unterordner anlegen möchte, umso mehr wird man sich in dem Dilemma verstricken, Ordner in anderen Ordnern erneut anzulegen, bis z. B. schließlich Unterordner Bilder in jedem Ordner Urlaub, Schriftverkehr, Plattensammlung etc. stecken.

Ähnlich schwierig ist dieses Problem für den Programmierer, der verschiedene Programmarten, deren Quellen, Lademodule, Logs, Standardkonfigurationen etc. für verschiedene Stände (meist Entwicklung, Test und Produktion) vorhalten muss. Der Baum in Abbildung 1 vermittelt einen guten Eindruck, wie schnell eine gut organisierte Programmierschmiede vor lauter Verzeichnisbäumchen im Walde steht. Die Dateiverteilung ist hier zwar gut strukturiert, dafür sind jedoch bei der täglichen Arbeit an der Konsole äußerst umfangreiche cd-Eingaben nötig.

Abbildung 1: Strukturierte Programmierschmiede

Dazu folgendes Beispiel: Ein Programmierer erfährt von einem Fehler im Produktivsystem seines Programms CoolBrowser und schaut zuerst dort in den default-Einstellungen nach, ob sich hier etwas Verdächtiges verbirgt. Zum Vergleich oder Nachstellen des Fehlers möchte er sich nun die Einstellungen in der Entwicklungsversion vornehmen. Das ist allerdings mit

cd ../../../../../entw/web/CoolBrowser/work/defaults

ein langer Weg (siehe Abbildung 2), und heiße Finger sind die Folge, da ständig vom Entwicklungs- ins Produktionssystem gewechselt wird.

Abbildung 2: Der lange Weg

Die Abkürzung

Viel praktischer wäre es, wenn man auf direktem Wege dorthin gelangen könnte – schließlich ist in diesem Beispiel die einzige wesentliche Information für das cd-Kommando, dass statt prod nun entw im Pfad auftauchen soll. Genau diese Möglichkeit bietet das cd-Kommando bei IBMs zLinux (übrigens auch in den Unix-Versionen USS und AIX). Ruft man cd hier mit zwei Parametern auf, durchsucht es den aktuellen Pfad nach dem ersten Auftauchen des ersten Parameters, tauscht dort die Zeichenkette gegen den Inhalt des zweiten Parameters aus und wechselt schließlich in das so ermittelte Verzeichnis. Mit dem Aufruf

cd prod entw

gelangt man also viel schneller ans Ziel (siehe Abbildung 3).

Abbildung 3: Der kurze Weg

Die cd-Erweiterung

Dies ist eine echte Erweiterung gegenüber dem nach POSIXdefinierten cd, und da sie nützlich ist, wollen wir sie auch in das normale Linux einbauen. Das geschieht recht einfach und schnell über eine function, die Sie selbst erstellen und beispielsweise in Ihre .bashrc dauerhaft einbinden können. Betrachten Sie kurz Listing 1, das Sie auch auf der Heft-CD finden.

Listing 1

Die Funktion <I>cd<I>

###############################
##     cd  -  erweitert     ###
###############################
function cd
{
  #
  # wurden mehr als zwei Parameter übergeben?
  #
  if [ "$#" -ge 3 ]; then
    echo cd: Falsche Anzahl an Parametern.
    return 2
  else
    #
    # erfolgte der cd-Aufruf klassisch mit (k)einem Parameter?
    #
    if [ "$2" = "" ]; then
      builtin cd $1
      return $?
    else
      #
      # konnte der erste Parameter im aktuellen Pfad nicht gefunden werden?
      #
      if [ "$(pwd | grep $1)" = "" ]; then
        echo cd: Erstes Argument kommt im aktuellen Pfad nicht vor.
        return 1
      else
        #
        # wechseln in das Verzeichnis mit vertauschter Zeichenkette
        #
        builtin cd $(pwd | sed "s/$1/$2/")
        return $?
      fi
    fi
  fi
}

Hier wird die Funktion cd definiert, in der zuerst die Anzahl der übergebenen Parameter überprüft wird. Die Funktion darf zwei Parameter erhalten, gibt also erst ab drei Parametern eine Fehlermeldung aus und den Returncode2 zurück. Dann unterscheidet die Funktion nach keinem, einem oder zwei Parametern. Bei keinem oder einem Parameter wird das cd-Kommando klassisch aufgerufen und dessen Rückgabewert zurückgegeben. Beachten Sie das Schlüsselwort builtin vor dem cd-Aufruf: Da die Funktion cd genannt wurde, überschreibt sie den in die Bash integrierten cd-Befehl. Mit vorangestelltem builtin erhält man aber stets den eingebauten Befehl. Ohne builtin würde die cd-Funktion sich hier selbst aufrufen und in eine Endlosschleife geraten.

Erst der Fall mit zwei Parametern ist wirklich interessant, denn hier wird zuerst getestet, ob sich der erste Parameter als Teilzeichenkette im aktuellen Pfad wiederfindet. Ist dies nicht der Fall, werden eine Fehlermeldung und der Returncode 1 zurückgegeben, ansonsten wird der Zielpfad durch Austausch des ersten Parameters durch den zweiten im aktuellen Pfad erstellt und dann (wieder mit builtin) das normale cd-Kommando aufgerufen. Somit bietet die cd-Funktion neben dem Zusatz-Feature alles, was das reguläre cd auch kann, so dass sie dauerhaft das eingebaute cd ersetzen kann.

Bekanntmachung

Wenn Sie diese Funktion in einer Datei neu-cd ablegen, können Sie diese durch Aufruf von

. neu-cd

aktivieren und fortan mit dem erweiterten cd-Befehl arbeiten. Wollen Sie diese Funktionalität auch in Zukunft nutzen, so kopieren Sie die Funktionsdefinition ans Ende der Datei .profile oder .bashrc – so ist sichergestellt, dass bei jedem Einloggen die neue cd-Funktion definiert wird.

Glossar

POSIX

Portable Operating System Interface, formuliert eine Reihe von Bedingungen an die Portabilität von Betriebssystemen. Dieser Standard sorgt dafür, dass sich ein Kommando auf verschiedenen Unix-Versionen im Wesentlichen gleich verhält.

Returncode

Jedes Kommando gibt einen Returncode zurück, der i. d. R. nach Ausführung in der Umgebungsvariablen $? zur Verfügung steht. Es ist vereinbart, dass ein Kommando den Wert 0 zurückgibt, wenn es erfolgreich gearbeitet hat. Treten Schwierigkeiten auf, so werden je nach Schwere Warnungen mit 1 bis 4 und Fehler mit 1 bis 16 im Rückgabewert quittiert. Der Wert ist kommandoabhängig.

Der Autor

Volker Schmitt ist Mathematiker und arbeitet bei einer großen Versicherung. Aus seiner Arbeit mit AIX und den Unix System Services hat er cd entw prod in seinem Linux sehr vermisst und sich mit der erweiterten cd-Funktion geholfen.

Einem Freund empfehlen    Druckansicht beenden Bookmark and Share
Kommentare