menu.jpg  ::  Home ::  Computing ::  Downloads ::  Harley Davidson ::  Links ::  Music ::  Nonsense ::  Mail :: 

Von den gängigen Linux-Distributionen wird als Standard-Shell stets die "bash" (Bourne Again Shell) installiert, die ein ausgereiftes und sehr gut dokumentiertes Werkzeug darstellt. Die freien BSD's installieren hingegen die gnadenlos veraltete "csh" (C-Shell) oder deren Weietrentwicklung, die "tcsh" (Tenex C-Shell). Diese weist IMHO ein paar ausgesprochen nützliche Features jenseits der Möglichkeiten der "bash" auf. Leider ist im Internet die Dokumentation zur 'tcsh' eher dünn gesäht.

Die Haupt-Unterschiede zur 'bash' liegen in der der Sprache C ähnlichen Syntax der 'if-then-else' Konstrukte und der Schleifen, die es ausgesprochen frustrierend machen können, mit der 'tcsh' Scripte zu entwickeln. Scripte sollte man IMHO aber ohnehin nicht Shell-spezifisch schreiben und für etwas anspruchsvollere Dinge Perl verwenden..

Ich bin eigentlich erst nach der Installation von FreeBSD auf die 'tcsh' aufmerksam geworden und verwende diese seitdem auch unter Linux.

1. Startup

Die tcsh liest bei ihrem Aufruf folgende Dateien ein:

Wenn man also keine besonderen Aktionen beim Ein- und Ausloggen ausführen möchte (z.B. einen Aufruf von 'fortune' ;-), kommt man theoretisch also mit den rc-Dateien aus.

BTW: Meine Konfiguration der Tenex C-Shell kann man in einer relativ aktuellen Version hier herunterladen.

2. Einige Features

Bei meinen Experimenten mit der 'tcsh' hatte ich den - vielleicht subjektiven - Eindruck, dass man einige Settings wesentlich subtiler einstellen kann, als unter der 'bash'. Beispielsweise kann man das nervige Piepen des Lautsprechers bei der Befehlsvervollständigung nicht nur an- und ausschalten, sondern auf bestimmte Ereignisse begrenzen:

Shellvariablen Wirkung
set matchbeep = never Es beept überhaupt nicht mehr
set matchbeep = nomatch Es erfolgt nur ein Beep, wenn kein passender Treffer zu finden ist
set matchbeep = ambiguous Es beept bei mehreren möglichen Treffern
set matchbeep = notunique Es beept nur, wenn ein exakter Treffer und andere mögliche Treffer vorhanden sind

Ausserdem kann man über den Alias 'beepcmd' eine Aktion definieren, die die Shell ausführt, wenn sie einen Beep ausgeben würde.

2.1 Die Auto-Korrektur

Die Auto-Korrektur ist ausgesprochen nützlich bei Tippfehlern, indem sie nach Eingabe des Befehls und Druck auf die 'Return'-Taste erst einmal prüft, ob etwas sinnvolles passieren wird. Sie wird über die Shellvariable 'set correct' ausgelöst, der folgende Parameter übergeben werden können:

Shellvariable Wirkung
set correct = cmd Nur Befehle werden ggf. überprüft
set correct = all Die gesamte Befehlszeile wird überprüft

Bei einem Fehler erscheint ein Prompt mit einem relativ intelligentem Vorschlag der Shell, den man annehmen oder ablehnen kann. Darüberhinaus kann man den Befehl an dieser Stelle abbrechen. Den Prompt kann man übrigens auch individuell gestalten (set prompt3 = ...).

2.2 Der run-help Mechanismus

Der run-help Mechanismus ist in Situationen nützlich, in denen man bereits einen Befehl eingegeben hat, sich aber über Optionen und Parameter nicht mehr ganz im Klaren ist. Als Bash-User ruft man in dieser Situation auf einer weiteren virtuellen Konsole/einem weiteren Terminal die Man Page auf oder löscht die bisherige Eingabe, um stattdessen die Man Page aufzurufen.

Als Tcsh-User gibt man [Alt]-h ein, um die Man Page einzusehen und kann nach deren Schliessen an derselben Stelle den Befehl fortsetzen:

   # ncftp[Alt]-h
   # ncftp

Um diesen Mechanismus unter der 'tcsh' nutzen zu können, muss man den Spezial-Alias 'helpcommand' in der '~/.cshrc'setzen:

   # alias helpcommand info

2.3 Die History

Mittels History-Funktionen kann man in der Vergangenheit eingegebene Befehle wieder in den Tastaturpuffer laden.

Die 'bash' hat eine sehr gute History Funktion, der man sehr detailliert mitteilen kann, was und in welchem Umfang sie protokollieren soll. Ich fand den Zugriff mittels '[Strg]-r' und Eingeben des Befehls Fragmentes immer sehr umständlich.

Die 'tcsh' greift mittels der Funktionen 'history-search-backward' und 'history-search-forward' auf ihre History zu. Diese Funktionen kann man auf beliebige Tasten legen (z.B. auf [Pfeil-Auf] und [Pfeil-Ab]). Das Feature schlechthin ist allerdings die Tatsache, das man schon während der Eingabe eines Befehls auf die History zugreifen kann und so schon nach der Eingabe weniger Anschläage die History nach entsprechenden Ergänzungen durchblättern kann.

Die Passagen zur History in meiner '~/.cshrc' sehen folgendermassen aus:

Shellvariable Wirkung
set history = 200 Die letzten 250 Befehle in die History nehmen
set histfile = ~/.csh_history Die History in der Datei '~/.csh_history' speichern
set histdup = erase Keine Doubletten in die History aufnehmen, die History chronologisch sortieren.
set savehist = ( 250 merge ) Die letzten 200 Befehle chronologisch sortiert beim Ausloggen speichern
bindkey -k up history-search-backward Mit Taste [Pfeil-Auf] History zurück durchsuchen
bindkey -k down history-search-forward Mit Taste [Pfeil-Ab] History vorwärts durchsuchen

2.4. Die Vervollständigung der Befehlszeile

Eines der genialsten Features der 'tcsh' ist die Vervollständigung der Befehlszeile. Neben der auch von der 'bash' bekannten Expansion von Eingaben mittels der Tabulatortaste können die Ergebnisse dieser Expansionen weiter verfeinert werden. Mittels der Anweisung

   # complete 'cd/1/d/'

werden bei der Vervollständigung von Pfadnamen bei einem 'cd' Kommando nur noch Verzeichnisse angeboten. Mittels weitere 'complete' Befehle kann man beispielsweise Aufrufe von 'gunzip' auf gezippte Dateien beschränken. Einige Beispiele aus meiner '~/.cshrc':

Befehl Beschreibung
complete {man,where,whereis,which} 'p/*/c/' Expandiert die in den geschweiften Klammern aufgeführten Befehle mit ausführbaren Dateien.
complete {latex,pdflatex} 'p/1/f:*tex/' Vervollstänfigt die Eingabe der Befehle 'latex' bzw. 'pdflatex' mit Namen von im selben Verzeichnis befindlichen Dateien mit der Endung '*.tex'.
complete unalias 'p/*/a/' Bietet alle Aliasse zur Expansion bei der Eingabe des eingebauten Befehls 'unalias' an.
complete {unset,unsetenv} 'p/1/v/' Bietet alle Umgebungs- und Shellvariablen zur Vervollständigung bei Eingabe der beiden eingebauten Befehle 'unset' bzw. 'unsetenv' an.

Einige Dateitypen können prinzipiell von der Expansion mittels der Shellvariable 'fignore' ausgeschlossen werden. Mit der folgenden Anweisung (am Prompt oder in der '~/.cshrc' werden zukünftig Dateinamen, die mit '.bak' oder '~' enden, bei der Vervollständigung nicht mehr angezeigt:

   # set fignore = ( \~ .bak)

Der 'tcsh'-Distribution liegt hierzu eine Beispiels-Datei von über 40 KB Grösse bei.

3. Weiterführende Links


Valid XHTML 1.0

Zurück zur Main-Site
Impressum
Created with GNU-Emacs on Sat Jan 26 09:06:58 CET 2002

Valid CSS