Was ist die Tenex-C-Shell?
Verbreitung erfuhr die C-Shell vor allem durch ihre enge Bündelung mit den BSD-Unix-Systemen. In ihre Entwicklung
flossen all die nützlichen Dinge der Bourne Shell ein, garniert mit einigen neuen Eigenschaften. Herausragend war
sicher die Verwendung einer History. Die C-Shell erbte von der Bourne Shell zwar das Konzept, die Realisierung orientierte
sich jedoch an der Programmiersprache C. Daher auch ihr Name.
Im interaktiven Umgang ist von der Nähe zur Programmiersprache C nichts zu merken. Erst der Shellprogrammierer
wird mit der Syntax konfrontiert, die vor allem dem Programmierer entgegen kommen wird.
Im Vergleich zur Bourne Shell agiert die C-Shell recht schwerfällig. Auf heutigen Megahertz-Boliden mag das kein
Kriterium Für oder Wider einer Shell zu sein, aber in den Anfängen von Linux verfügten die Rechner
über weitaus weniger Leistung. Vielleicht ist hier ein Grund für die geringe Akzeptanz der (Tenex-)C-Shell unter
Linux zu suchen.
Während die C-Shell einem kommerziellen Lizenzmodell unterliegt, ist die Weiterentwicklung in Form der
Tenex-C-Shell (Tcsh) frei und damit unter Linux verfügbar. Im Wesentlichen unterscheidet sich die Tcsh von
ihrem Ahnen durch die verschiedenen Mechanismen zur Vervollständigung nach so genanntem Tenex-Stil.
Aber nicht nur dem C-Programmierer kommt die C-Shell entgegen. Auch wer in der Solaris-Ecke heimisch ist und nur hin
und wieder mit Linux in Berührung kommt, muss die vertraute Shell nicht missen.
Csh vs. Tcsh
Nur kurz sollen die wesentlichen Unterschiede zwischen den beiden Shells aufgezählt werden. Die
Tenex-C-Shell erweitert die Fähigkeiten der C-Shell um:
- Editieren von Kommandozeilen (auch nach VI- oder Emacs-Stil)
- Login-/Logout-Überwachung
- History-Vervollständigung
- Periodische Ausführung von Kommandos
- Rechtschreibkorrektur (funktioniert nur bei »geringen« Fehlern)
- Umgang mit langen Argumentlisten
Nur das Unterbinden des Einlesens von Benutzer definierten Startdateien wurde in der Tcsh im
Unterschied zur C-Shell nicht implementiert.
Und zahlreiche Fehler, die die Implementierungen der C-Shell in sich bergen, sind in der Tcsh
ausgemerzt. Leider noch nicht alle, wobei Kenner das für unmöglich halten, da Designfehler
manche Ungereimtheiten bedingen.
Gliederung dieses Abschnitts
Wichtige Fähigkeiten
In obigem Vergleich zwischen Csh und Tcsh finden Sie die wichtigsten Argumente für die
Verwendung der Tcsh. Etwas präziser soll die folgende Aufzählung ihre Stärken
untermauern:
-
Vollständig abwärtskompatibel zur C-Shell (nur einige Fehler des
»Vorbilds« wurden behoben;-).
-
Im Kommandozeilenspeicher (»History«) der Tcsh können Eingaben gesucht,
bearbeitet und erneut ausgeführt werden. Das konkrete Verhalten ist konfigurierbar.
-
Die Tcsh verwendet eine C-ähnliche Syntax.
-
Prozesse können vom Benutzer gestartet, gestoppt und ihre Eigenschaften verändert
werden.
-
Unvollständige Eingaben von Kommando- und Dateinamen u.a.m. können
automatisch expandiert werden. Wie die Expansion erfolgen soll, ist konfigurierbar.
-
Geringe Fehler in der Eingabe können automatisch korrigiert werden
-
Das Eingabeprompt ist konfigurierbar.
-
Berechnungen analog zu C werden unterstützt.
-
Die Tcsh verwendet eine C-ähnliche Syntax.
-
Die Tcsh unterstützt keine Nutzer definierten Funktionen.
Die folgenden Begriffe werden im Laufe des Textes wiederholt benötigt. Ihre Definitionen
sind sicher nicht vollständig, sollten aber zum Verstehen ihrer Bedeutung genügen.
Kommentare |
|
Siehe unter Syntax der Tcsh, Kommentare.
|
Kommando-Trennzeichen |
|
Das Semikolon oder der Zeilenumbruch begrenzt ein Kommando.
|
Operatoren |
|
Zusammenfassung von Zuweisungs-, arithmetische, logische und Vergleichsoperatoren. Ein Operator
besteht aus ein oder zwei Zeichen mit Sonderbedeutungen (bspw. +, ++, -, ||, +=, <). Wir werden
im Laufe des Textes auf die verschiedenen Operatoren genauer eingehen.
|
Whitespace |
|
Steht für Leerzeichen und Tabulatoren und ggf. dem Zeilenumbruch.
|
Wort |
|
Ein Wort ist eine Folge von Zeichen, die entweder von Whitespaces, von Kommando-Trennzeichen oder
von Operatoren umgeben ist. Beachten Sie, dass obige Worttrenner auch Bestandteil eines Wortes
sein können, wenn diese gequotet sind.
|
Abbildung 1: Unterteilung der Tcsh
Interaktive und Nicht-Interaktive Tcsh
Ist die Tenex-C-Shell mit der Standardein- und Standardausgabe (sprich »mit einer
(virtuellen) Konsole«) verbunden, so handelt es sich um eine interaktive
Shell. Die interaktive Bash teilt sich wiederum ein in die Login Tcsh
und die Nicht-Login Tcsh. Eine Shell mit eingeschränkten Nutzungsbefugnissen wie in der
Bash gibt es nicht.
Die Tcsh fungiert als Login-Shell, wenn sie entweder explizit mit der Option »-l« ([kleines
»L«] und keiner weiteren Option!) gestartet wurde oder wenn das erste Argument (Argument 0)
»-« ist.
Die Login-Shell führt zunächst Kommandos aus den System weiten Dateien »/etc/csh.cshrc«
und »/etc/csh.login« aus. Die Reihenfolge der Betrachtung der Nutzer definierten Startdateien ist
abhängig von der konkreten Version. Meist wird die Datei »~/.tcshrc« betrachtet und nur falls
diese nicht existiert die Datei »~/.cshrc«. Falls vorhanden, werden der Reihe die
Dateien »~/.history«, »~/.login« und »~/.cshdirs« eingelesen.
Jede Nicht-Login-Shell führt nur Kommandos der Dateien »/etc/csh.cshrc« und
»~/.tcshrc« bzw. »~/.cshrc« aus.
Optionen beim Start
Wir beschränken uns hier auf die wichtigsten Optionen.
-c Kommando |
|
Die Tcsh führt das angegebene Kommando aus und endet anschließend. Das Kommando
muss ein einzelnes Argument sein; umfasst es Optionen, ist der gesamte Ausdruck zu
quoten:
user@sonne> tcsh -c 'ls -l ~/../'
insgesamt 8
drwxr-xr-x 22 user users 4096 Aug 22 11:12 user
drwxr-xr-x 22 tux users 4096 Aug 22 11:12 tux
|
|
-d |
|
Die Shell lädt den Verzeichnisstack aus »~/.cshdirs«; sinnvoll nur bei einer
Nicht-Login-Tcsh.
|
-e |
|
Die Tcsh endet sobald eines der in ihr ausgeführten Kommandos mit einem Fehler zurückkehrt;
nützlich in Shell-Skripten.
|
-f |
|
Ignoriert die Datei »~/.tcshrc«.
|
-i |
|
Die Shell ist interaktiv selbst dann, wenn ihre Ein- und Ausgabe nicht mit einem Terminal
verbunden ist.
|
-l |
|
Die Tcsh arbeitet als Login-Shell. Die Option wird ignoriert, wenn außer ihr
weitere Argumente angegeben werden.
|
-n |
|
Die Shell parst Kommandos ohne sie auszuführen; sinnvoll bei der Fehlersuche in
Shell-Skripten.
|
-v |
|
Die Shellvariable verbose wird gesetzt. Jedes Kommando wird nach
der History-Substitution nochmals angezeigt.
|
-x |
|
Die Shellvariable echo wird gesetzt. Jedes Kommando wird unmittelbar vor seiner
Ausführung (also nach Vollzug sämtlicher Substitutionen) nochmals angezeigt.
|
-V |
|
Wie »-v«, nur wird die Variable bereits vor der Verarbeitung der Datei
»~/.tcshrc« gesetzt.
|
-X |
|
Wie »-X«, nur wird die Variable bereits vor der Verarbeitung der Datei
»~/.tcshrc« gesetzt.
|
In den meisten Konfigurationen, die die Distributoren ausliefern, dürfte die Bash
als Login-Shell voreingestellt sein. Bemühen Sie das Kommando chsh,
um die Tcsh in der Passwortdatei als Default-Shell einzutragen.
Dies funktioniert jedoch nur, wenn die Tcsh in der Datei /etc/shells eingetragen ist. Ist dem nicht so, könnte
Ihnen entweder der Administrator aus der Patsche helfen, indem er den Eintrag in obiger
Datei ergänzt oder Sie bauen in einem der Startup-Skripte Ihrer bisherigen
Login-Shell den Aufruf »exec /usr/bin/tcsh -l« ein.
Zum Beenden stehen mehrere Möglichkeiten zur Verfügung. Ein [Ctrl]-[D] auf einer leeren
Eingabezeile beendet sowohl die Login- als auch die Nicht-Login-Shell. Die Kommandos »logout«
und »login« stehen allerdings nur in einer Login-Shell zur Verfügung. Letzteres ersetzt
den Shellprozess durch das gleichnamige Kommando.
Eine Besonderheit der Tcsh ist der Autologout-Mechanismus, der über die Belegung der Shellvariable
autologout gesteuert wird. Mit dieser können Sie zwei verschiedene Zeiten (in Minuten) definieren.
Zum einen die Zeitspanne, nach der die Shell bei Inaktivität automatisch abgemeldet wird und zum anderen
(optional) die Dauer der Inaktivität, nach dem die Shell automatisch gesperrt wird. Eine gesperrte
Shell kann nur durch Eingabe des Passworts reaktiviert werden. Fünfmalige falsche Passworteingabe
führt automatisch zu einem Autologout.
user@sonne> tcsh -l
sonne /home/user> set autologout = 1
# Nach 1 Minute des Nichtstuns...
user@sonne> auto-logout
|
Beim Beenden der Tcsh setzt diese in Abhängigkeit vom verwendeten Mechanismus die
»logout« Shellvariable auf »normal« oder »automatic«.
Abschließend führt sie Kommandos aus den Dateien »/etc/csh.logout« und
»~/.logout« aus.
Der weitere Text erklärt:
Normalerweise leitet das Doppelkreuz # in der Tcsh einen Kommentar ein. Alles, was diesem
Zeichen folgt, wird von der Tcsh ignoriert bis zum nächsten Zeilenumbruch. Dies gilt sowohl für
die interaktive als auch für die nicht-interaktive Tcsh.
Eine Ausnahme sind Shellskripte, in denen die erste Zeile mit #!... beginnt. Für die
Tcsh ist es die Anweisung, die nachfolgenden Zeilen mit dem hinter »#!« angegebenen
Interpreter (eine Shell, Perl, awk, ...) auszuführen.
Die Bedeutung von # kann durch Quoten (siehe später) aufgehoben
werden.
Variablennamen bestehen aus Buchstaben, Ziffern und dem Unterstrich, wobei ein Name nicht
mit einer Ziffer beginnen darf. In der Tcsh existiert keine (praktische) Begrenzung der Länge
von Variablennamen. Als Faustregel gilt, dass Umgebungsvariablen aus Groß- und lokale
Variablen aus Kleinbuchstaben bestehen, aber die Shell selbst setzt diesbezüglich keine
Vorschriften.
Bei der interaktiven Arbeit mit der Tcsh zeigt die Shell ihre Bereitschaft zur Entgegennahme von Eingaben
anhand eines Prompts (»Eingabeaufforderung«) an. Drei Prompts werden unterschieden, wobei
zwei die Eingabeaufforderung symbolisieren:
- prompt1: Dieses zeigt an, dass die Tcsh eine neue Eingabe erwartet.
- prompt2: Das »Fortsetzungsprompt« erscheint bei
unvollständigen while- oder foreach-Schleifen sowie nach Zeilen, die mit dem Backslash \ enden.
- prompt2: Das Prompt erscheint im Fehlerfall und bietet eine kleine Korrekturhilfe
durch die Tcsh.
Formatsequenzen:
: |
Dieses »Kommando« tut nichts, außer einen Rückgabewert
»0« zu erzeugen (»0« ist der übliche Rückgabewert eines
Kommandos unter Unix, wenn seine Ausführung erfolgreich war). Nützlich ist es in
Shellskripten, falls Sie in Bedingungen einen wahren Wert (»true«) benötigen
oder an Positionen, wo syntaktisch ein Kommando erwartet wird, Sie aber keines benötigen:
user@sonne> while : ;do echo "Eine Endlosschleife"; done
Eine Endlosschleife
Eine Endlosschleife
Eine Endlosschleife
...
Eine Endlosschleife[Ctrl]+[C]
user@sonne> if test -a foo ; then :; else
echo "Datei nicht existent"; fi
Datei nicht existent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Der Kommandozeilenspeicher
Der Kommandozeilenspeicher (History) verwaltet die Liste vormals eingegebener Kommandos.
Sie kann sowohl als Referenz der bisherigen Kommandofolge als auch als eine Art Baukasten
zur komfortablen Zusammenstellung neuer Kommandozeilen dienen.
Zum Betrachten des aktuellen Inhalts des Kommandozeilenspeichers steht das eingebaute
Kommando history zur Verfügung:
sonne /home/user> history | head
1 12:46 setenv TERM '`/bin/ls -l / > /dev/tty`'
2 12:46 set autologout = "10 5"
3 12:46 echo $status
4 12:46 repeat 3 sleep 1
5 12:46 time | echo
6 13:01 set foo = "this \
and that"
7 13:01 set foo = "this \
and that" ;
8 13:02 echo "$foo" ;
|
In der Voreinstellung werden die letzten 100 Kommandos aufgelistet. Durch Angabe der Anzahl
als letztes Argument von »history« kann die Länge der Ausgabe variiert werden.
Des Weiteren versteht »history« folgende Optionen:
-c |
|
Löscht den Inhalt des Kommandozeilenspeichers.
|
-h [n] |
|
Unterdrückt die Ausgabe der Zeilenummerierung. Normalerweise sind alle
Einträge nummeriert, wobei der älteste Eintrag die Nummer 1 trägt.
Anhand solcher Nummern kann gezielt auf einen Eintrag des Kommandozeilenspeichers
zugegriffen werden. Die Angabe von n spezifiziert die Anzahl auszugebender
Einträge.
|
-r [n] |
|
Schreibt die n letzten Einträge in umgekehrter Reihenfolge aus (den Ältesten zuletzt).
|
-T [n] |
|
In Verbindung mit »-h« wird der Zeitstempel der Einträge auf einer extra
Zeile vor dem jeweiligen Eintrag ausgegeben. Die Zeitstempel sind als Kommentare markiert.
Diese Ausgabe entspricht dem Format einer History-Datei.
|
-S [Dateiname] |
|
Speichern der History. Ist ein Dateiname angegeben, wird die History dorthin geschrieben, ansonsten
landet sie in der »normalen« History-Datei (Spezifiziert durch die Shellvariable
»histfile» oder, falls diese nicht gesetzt ist »~/.history«). Wie viele
Zeilen geschrieben werden und ob der Inhalt einer vorhandene Datei mit den neuen Einträgen
gemischt wird, hängt von der Belegung der Shellvariablen savehist ab (siehe nachfolgend).
|
-L Dateiname |
|
Lädt die angegebene Datei und hängt die Einträge an den Kommandozeilenspeicher an.
Die Datei sollte also im History-Format vorliegen (vergleiche Option »-T«).
|
-M Dateiname |
|
Wie »-L«, jedoch wird der Inhalt mit dem existierenden anhand der Zeitstempel gemischt
anstatt ihn »hinten« anzuhängen.
|
History-Variablen
Zahlreiche Shellvariablen beeinflussen den Kommandozeilenspeicher. Dazu zählen:
histchars |
|
Mit dieser Variablen kann die Vorbelegung des »History-Substitutionszeichens« (!)
und des Ersatzzeichens für das erste Argument (^) modifiziert werden. Weisen Sie hierzu
die beiden neu zu verwendenden Zeichen ohne Leerreichen der Variablen zu.
|
histdup |
|
Die Variable steuert den Umgang mit identischen Einträgen im Kommandozeilenspeicher.
Steht ihr Inhalt auf »all«, wird das aktuelle Kommando nur in die History aufgenommen,
wenn noch kein identischer Eintrag existiert. Steht er auf »prev«, wird ein
Kommando nur aufgenommen, wenn es nicht dem letzten Eintrag entspricht. Mit »erase«
wird ein vorhandener identischer Eintrag entfernt und das aktuelle Kommando landet am Ende
des Speichers. Bei jedem anderen Wert oder falls die Variable nicht gesetzt ist, wird jede
Kommandozeile in die History eingetragen.
|
histfile |
|
Enthält den Namen der Datei zum Abspeichern der History-Einträge. Ist die
Datei leer, wird »~/.history« angenommen, was der üblichen Verfahrensweise
entspricht.
|
histlit |
|
????
|
history |
|
Die Variable enthält einen oder zwei Werte. Der erste Wert gibt die Anzahl der
Einträge an, die im Kommandozeilenspeicher gehalten werden sollen. Der zweite
optionale Wert ist eine Formatzeichenkette, die angibt, wie Einträge der History
für die Ausgabe zu formatieren sind. Als Formatierer kommen die unter
Prompts genannten Zeichen in Frage.
|
savehist |
|
Sobald die Variable gesetzt ist, ruft eine Shell, bevor sie endet, »history -S« auf,
womit der aktuelle Zustand des Kommandozeilenspeichers in die durch Datei »histfile«
sichert wird. »savehist« kann zwei Werte enthalten. Der erste gibt an, wie viele
Einträge des Kommandozeilenspeichers in die Datei zu sichern sind. Dieser Wert muss
kleiner oder maximal gleich dem ersten Wert der »history«-Shellvariable sein.
Ein optionaler zweiter Wert »merge« bewirkt, dass die aktuellen Werte der History
mit dem Inhalt einer existierenden Datei (bezeichnet durch »histfile«) gemischt werden,
wobei der Zeitstempel der Einträge als Kriterium der Sortierung dient.
|
Navigation in Einträgen des Kommandozeilenspeichers
Durch die Liste der Kommandos in der History und innerhalb einer Kommandozeile können Sie
komfortabel mit Hilfe der Pfeiltasten und von Tastenkombinationen navigieren:
, [Ctrl][P] |
|
Geht zum vorhergehenden Eintrag. |
, [Ctrl][N] |
|
Geht zum nachfolgenden Eintrag. |
 |
|
Ein Zeichen nach links in der aktuellen Zeile. |
 |
|
Ein Zeichen nach rechts in der aktuellen Zeile. |
[Home] |
|
Beginn aktuellen Zeile. |
[End] |
|
Ende aktuellen Zeile. |
Obige Tastenkombinationen beschreiben die Voreinstellung. Mittels dem eingebauten Kommando bindkey
ist eine Änderung der Belegung möglich.
Eine Suche im Kommandozeilenspeicher wird ebenso angeboten:
Muster[Alt][p] |
|
Sucht rückwärts nach einem mit dem Muster beginnenden Eintrag. |
Muster[Alt][n] |
|
Sucht vorwärts nach einem mit dem Muster beginnenden Eintrag. |
Das Muster kann die Metazeichen »*«, »?«, »[]« und
»{}« umfassen, allerdings betrifft dann die Suche nicht den Zeilenanfang sondern die
gesamte Zeile. »echo« und »echo*« führen bspw. beide zur letzten
Kommandozeile, die mit »echo« startete. »*echo« listet jedoch einzig eine
Zeile auf, die mit »echo« endete. Um die Kommandozeile zu finden, die »echo«
an beliebiger Position enthielt, ist folgende Eingabe erforderlich:
sonne /home/user> *echo*[Alt][p]
sonne /home/user> grep -q foo bla | echo "huchuuuu"
|
Zugriff über die History-Substitution
Eine History-Substitution wird mit dem so genannten »Bang-Operator« (!) eingeleitet.
Die Art der Substitution schreiben die nachfolgenden Zeichen vor. Um keine History-Substitution
handelt es sich jedoch, wenn dem »Bang-Operator« ein Whitespace, ein Gleichheitszeichen
oder eine öffnende runde Klammer folgt (dann handelt es sich um einen unären Operator
[Negation]).
Folgende Ausdrücke gestatten die Ausführung von Kommandozeilen aus der History ohne
deren vorherige Manipulation:
!! |
|
Startet das vorhergehende Kommando (letzter Eintrag im Kommandozeilenspeicher).
|
!n |
|
Startet das Kommando von Zeile n der History.
|
!-n |
|
Startet das Kommando der n-letzten Zeile des History (es wird also
von »hinten« gezählt; »!-1« entspricht »!!«).
|
!Präfix |
|
Startet das aktuellste in der History eingetragene Kommando, das mit dem Präfix
beginnt.
|
!?Muster? |
|
Startet das aktuellste in der History eingetragene Kommando, das das Muster
enthält.
|
Einige Beispiele dazu:
sonne /home/user> cat foo
# Ausgabe des Inhalts von »foo«
sonne /home/user> !! | wc -l
cat foo | wc -l
26
sonne /home/user> history | head -5
1 12:39 cal
2 12:39 ( cd ; make )
3 12:50 vi ~/foo.cpp
4 12:50 history --help
5 12:50 g++ ~/foo.cpp -o ~/foo
sonne /home/user> !4
history --help
Benutzung: history [-chrSLMT] [# Anzahl der Befehle].
sonne /home/user> !vi
vi ~/foo.cpp
|
Die Wiederverwendung alter Kommandos nach obigem Substitutionsschema reißt sicher niemanden
vom Hocker. Worin sollte der Vorteil gegenüber der Navigation im Kommandozeilenspeicher bestehen,
die sogar das Editieren alter Einträge ermöglicht?
Die weit reichenden Möglichkeiten der Substitution nutzen erst die Erweiterungen zum
Bang Operator - so genannte Wortselektoren. Sie gestatten die Verwendung von Teilen eines vorherigen
Kommandos in der aktuellen Kommandozeile. Eingeleitet wird eine solche Erweiterung durch einen Doppelpunkt,
der dem Bang Operator und dem Muster, das das alte Kommando referenziert, folgt. Ein Beispiel ist hoffentlich
verständlicher als meine Umschreibung:
sonne /home/user> echo "1 2" 3 "4 5 6"
1 2 3 4 5 6
sonne /home/user> echo !!:3
4 5 6
|
Der Ausdruck »!!:3« wurde durch das dritte Argument des vorhergehenden Kommandos
substituiert. Zugegeben... es ist kein sinnvolles Beispiel. Aber es ist einfach und sollte leicht
zu verstehen sein. Der Zweck heiligt die Mittel.
Folgende Aufzählung benennt sämtliche Erweiterungen, mit denen Bestandteile von
History-Einträgen extrahiert werden können.
n |
|
Nummer des Arguments. »0« steht für das erste Wort der Kommandozeile
selbst, was i.d.R. der Kommandoname ist.
|
-n |
|
Argumente 0 bis n.
|
n- |
|
Argumente von n bis zum Vorletzten (!).
|
m-n |
|
Argumente von m bis n (m und n eingeschlossen).
|
^ |
|
Kurzform für das erste Argument (wie »:1«).
|
$ |
|
Das letzte Argument.
|
* |
|
Alle Argumente ab dem ersten (also ohne den Kommandonamen).
|
% |
|
Nur in Verbindung mit »!?Muster?« erlaubt. »%« enthält
das Wort, das das Muster enthielt.
|
Hierzu wieder einige Beispiele:
# Netzwerkschnittstelle initialisieren
sonne /root> ifconfig eth0 192.168.100.100 up
...
# ... Netzwerkschnittstelle runter fahren
sonne /root> !ifc:-1 down
ifconfig eth0 down
# PDF-Version der Fibel erzeugen
sonne /home/user> htmldoc --book --webpage -f Linuxfibel.pdf toc.htm
einleitung.htm # ...125 weitere Dateien
# Upps... eine Datei vergessen;-)
sonne /home/user> !!:-4 default.htm !!:5-$
|
Ganz schön verwirrend... oder? Aber es kommt noch besser! Sie sind nicht einmal darauf angewiesen, die Argumente
in ursprünglicher Form zu verwenden, sondern Sie können diese mit verschiedensten Modifizierern auch noch
zuvor bearbeiten. Vorab die Liste der Modifizierer:
:e |
|
Betrachtet das Argument als Dateiname und liefert - falls vorhanden - dessen Suffix.
|
:h |
|
Entfernt in Pfadangaben die letzte Komponente, »:h:h« würde die
beiden letzten Komponenten entfernen usw.
|
:p |
|
Unterdrückt nach einer History-Substitution die Ausführung des Kommandos. Der Modifizierer
eignet sich also zum Testen des korrekten Substitutionsausdrucks. Allerdings taucht das resultierende
Kommando trotzt Nichtausführung anschließend als eigenständiger Eintrag in der History auf.
|
:q |
|
Quotet im Ergebnis das substituierte Wort (schützt somit vor weiteren Expansionen).
|
:r |
|
Entfernt den Suffix von Dateinamen. Der trennende Punkt bleibt erhalten. Mehrere Suffixe können
durch entsprechend viele Angaben des Modifizierers abgeschnitten werden.
|
:s/x/y/ |
|
Ersetzt im substituierten Wort die Zeichenkette x durch die Zeichenkette y. x darf
kein Regulärer Ausdruck sein. In y steht & zur Verfügung,
um auf die substituierte Zeichenkette zugreifen zu können. Anstatt dem Trennzeichen / kann
jedes beliebige andere Zeichen, welches nicht in den beiden Zeichenketten vorkommt, Verwendung finden.
|
:t |
|
Entfernt in Dateinamen den kompletten Pfadanteil.
|
:x |
|
Trennt das substituierte Wort an jedem Whitespace.
|
:& |
|
Verwendet den zuletzt genutzten Zeichenkettenmodifizierer erneut.
|
Und zum Abschluss wiederum einige Anwendungsbeispiele obiger Modifizierer:
sonne /home/user> ls /home/tux/komplizierterPfad/komplexerName
/home/tux/komplizierterPfad/komplexerName
sonne /home/user> cp !!^ !!^:t
cp /home/tux/komplizierterPfad/komplexerName komplexerName
sonne /root> cp -r /etc/skel /home/user
sonne /root> !!:-$:s/user/tux/
cp -r /etc/skel /home/tux
sonne /root> !!:-$:s?tux?&racer?
cp -r /etc/skel /home/tuxracer
|
Für die Zeichenkettenersetzung im vorhergehenden Kommando existiert ein spezieller Modifizierer. Roots
Kopieroperationen in obigem Beispiel hätten auch wie folgt substituiert werden können:
sonne /root> cp -r /etc/skel /home/user
sonne /root> ^user^tux
cp -r /etc/skel /home/tux
sonne /root> ^tux^&racer
cp -r /etc/skel /home/tuxracer
|
Diese Kurzform eignet sich also wirklich nur, wenn das vorherige Kommando mit genau einem geänderten Argument
zu wiederholen ist.
|