:: Home :: Computing :: Downloads :: Scooter :: 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.
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.
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.
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 = ...).
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
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 |
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.
Zurück zur Main-Site |