ftblog

:: widerstand zwecklos ::
email jabber gpgkey
hackergotchi

September 12, 2005

Tooltime: zsh #2

Filed under: tooltime -- 14:48

Allgemeiner Umgang mit einer Shell

Alle Un*x User sind normalerweise schon mit ihrer Shell aneinander geraten.
Leider kennen viele Leute die einfachsten und besten Tricks nicht.
Daher schiebe ich an dieser Stelle einmal einen Artikel ein in dem
ich Grundlegendes bespreche. Trotzdem passt es hervorragend in meine
Z-Shell Reihe, da die zsh natürlich alle diese Features besitzt.

1. Keyboard Shortcuts

EDIT:
: Die META Taste ist im Allgemeinen die Alt Taste.
: Es gibt Terminals auf denen man nur per Escape Taste
: den gewünschten Keycode hinbekommt.
: Bei Alt drückt man Alt und die entsprechende Kombination
: zusammen. Bei Escape drückt man erst Escape, läst diese dann
: los und drückt dann die entsprechende Kombination.

In allen Standart Shells gibt es normalerweise 2 verschiedene
Tastenbelegungen. Die eine orientiert sich am emacs, die andere (wie
sollte es anders sein) am vi. Und obwohl ich ein vi Fan bin finde ich
die emacs Keymap für Shells überlegen. Daher werde ich mich darauf
beschränken. Wer die vi Einstellung unbedingt will, der muss sich
halt 2 Minuten mit der Dokumentation seiner Shell auseinandersetzen. :)

Die Pfeiltasten nach links und rechts bewegen auch den Cursor durch die
aktuelle Zeile, mit den Pfeiltasten nach oben und unten kann man durch die
sog. Kommandohistory blättern (dh. man kann alte Kommandos wieder benutzen).

Weitere unverzichtbare Kommandos:

TastendruckFunktion
Control-aAn den Zeilenanfang springen
Control-eAn das Zeilenende springen
META-bEin Wort zurück springen
META-fEin Wort vor springen
Control-kLöscht vom Cursor bis zum Zeilenende
Control-uLöscht die ganze Zeile
META-Backspace/Control-wLöscht ein Wort nach links
META-dLöscht ein Wort nach rechts
Control-tDas aktuelle Zeichen und das vorige tauschen
META-tDas vorherige und das aktuelle Wort tauschen


Nun seien ein paar History Kommandos angesprochen:
Das einfache blättern in der History hatte ich ja oben bereits angesprochen.
Da es sehr viele Kommandos zur History gibt, beschränke ich mich
hier auf eine wenige. Weiteres ist, wie immer, in der jeweiligen Doku zu
nachzuschlagen.

Als erstes sei auf die beiden Kommandos META-p und META-n hingewiesen.
Beide Befehle funktionieren ähnlich zu Pfeil-auf und Pfeil-abwärts.
mit dem Unterschied, das schon getipptes berücksichtigt wird:
Tippe ich zB 'ls <META-p/n>' kann ich durch alle history Einträge
blättern, die mit 'ls ' beginnen. Sehr nützlich!

Ein weiterer Befehl ist für folgendes hilfreich:

% ls -la /langer/pfad/zu/einer/datei/mit/blödem_namen.tex
% chown myuser.texauthors /langer/pfad/zu/einer/datei/mit/blödem_namen.tex
% vim /langer/pfad/zu/einer/datei/mit/blödem_namen.tex

Beim 'ls' sucht man sich mühsam den Dateinamen per TAB-Completion zusammen.
Bei 'chown' und 'vim' jedoch benutze ich das 'META-.' Kommando.
Das fügt denn nämlich an aktueller Stelle das letzte Argument der vorherigen
Befehlszeile wieder ein. Gerade bei langen Namen eine feine Sache.

Und einer der mächtigsten History Befehle ist 'Control-r'. Man drückt diese
Kombination wenn man noch gar nichts in die aktuelle Zeile getippt hat.
Nun kann man eine Zeichenfolge eingeben, und die Shell sucht rückwärts durch
alle History Einträge nach dem letzten vorkommen dieser Kette und schreibt den
entsprechenden History Eintrag in die aktuelle Befehlszeile.
Das Zeitersparnis durch dieses Kommando ist riesig.

Ein letztes Super Feature von modernen Shells (das an einem Tastendruck
hängt) ist die Fähigkeit angeangene Worte auf Tastendruck zu kommpletieren.
Nun war das im Anfang auf Befehle, Dateinamen und evtl. noch Hostnamen
beschränkt. In der zsh gab es recht früh eine komplett programmierbare
Completion. Diese Programmierbarkeit wurde vor einiger Zeit komplett neu
implementiert, und nun kann man in der zsh praktisch _alles_ komplettierbar
machen. Und das sogar recht einfach. Andere Shells haben kein derart
flexibles System an Bord. Für die Bash gibt es ein zusätzliches Stück
Software welches eine programmierbare Completion nachliefert. Die tcsh
soll auch von Haus aus so etwas haben, allerdings kann ich dazu nichts
sagen, da ich damals beim Shells durchprobieren recht schnell die Nase
von der tcsh voll hatte. :)
Die bash Completion gibt's hier

Die Completion wird in einer Shell meist durch die Tabulator Taste getriggert:

% ls
deine_datei ihre_datei meine_datei
% vim d<TAB>
kompletiert die Eingabe zu:
% vim deine_datei

Und wenn man sich nun vorstellt _alles_ so kompletieren zu können, dann kann
man sich denken wie viel Arbeit das einem erspart...

2. Globbing

Beim Globbing geht es darum eine Gruppe von Dateinamen zu generieren.
zB. kann man mit *.c alle Dateien ansprechen die mit '.c' enden.
Natürlich ist Globbing noch _viel_ mächtiger. Man sollte dazu die
jeweilige Doku seiner Shell zu rate ziehen.
Gerade das Globbing ist eines der mächtigsten Features der zsh.

3. Pipeline + Redirection

Mit diesen 2 Funktionen kann man den Output eines Prozesses an einen
anderen Process (Pipeline) oder in eine Datei (Redirection) umleiten.

% dpkg -l | cut -d\\ -f3 | grep cc
--> cut bekommt seine Eingabe von dpkg und gibt seinen Output an grep

% dpkg -l | cut -d\\ -f3 | grep cc > /tmp/__pakete_mit_cc__
--> schreibt den Output des Kommandos in eine Datei

Genaueres kann man wie immer in der Doku seiner Shell nachlesen.
Hier geht es um das Prinzip.

4. Job Control

Mit dieser Funktion kann man mehrere Processe nebeneinander laufen
lassen. Zum Beispiel:

% find / -name "*.cc" -print > /tmp/c++_sources 2> /dev/null &
% ls
--> Führt den find Aufruf aus, packt ihn in den Hintergrund
--> so das man direkt zB. mit einem 'ls' Aufruf weiter machen kann.

Mit einem '&' kann man einen Prozess direkt nach seinem Aufruf in
den Hintergrund verfrachten.
Wichtig sind an dieser Stelle Control-Z und die Kommandos
bg, fg, und jobs, die man in der Shell Doku nachschlagen kann.

5. Aliases

Manchmal tippt man Befehle immer mit den gleichen Optionen, oder ein
Befehl ist nervig lang... Dann kann man Aliase definieren die einem die
Tipparbeit abnehmen.
Ich habe beispielsweise einen Alias für den ls Befehl definiert:

% alias ls='ls --color'
As easy as that!
Das ist denke ich das Minimum an Dingen die man (und Frau) mit einer Shell
anstellen können sollten. Wer das schon nervig findet sollte lieber
weiter klicken. Wer denkt "Cool, das sind ja geile Features!" der sollte
überlegen ob er nicht etwas mehr in der Dokumentation seiner Shell hätte
lesen sollen, um weniger arbeiten zu müssen, wenn man seine Shell nutzt.
Wer denkt "Ja geil. Du alter Hacker! Sach ma' endlich wat neuet!", der soll
gefälligst die Klappe halten ;-)

Wie immer gilt der Leitspruch "Lesen bildet" - An dieser Stelle sei bei
meinen groben Einführungen immer auf die jeweilige Shell Dokumentation
verwiesen.

Auf Adam Spiers' Homepage gibt es zu diesem Thema eine etwas eingehendere
Abhandelung, die sich wirklich lohnt, wenn man Newbie ist :)

Powered by zblog
valid css | valid xhtml | utf-8 encoded | best viewed with anybrowser