DaLUG-Vortrag
23. September 2005, TU Darmstadt
Axel Beckert
<abe@noone.org>
http://noone.org/abe/
»Shell« (engl. für Muschelschale, Gehäuse) ist der umgangssprachliche Begriff für einen Kommandozeileninterpreter (engl. command line interpreter — CLI), kann aber auch andere Progamme zum interaktiven Aufrufen von Befehlen meinen, z.B. den Windows Explorer, Konqueror, Nautilus, den Norton Commander oder den Midnight Commander.
Kommandozeilen-basierte Shells lesen eine (oder mehrere) Zeilen Text ein, interpretieren diese als Kommando und führen es aus. Im folgenden wird der Begriff Shell mit einem Kommandozeileninterpreter gleichgesetzt.
Auf Unix-Systemen hat jeder Benutzer seine sog. Login-Shell, die
Shell, die automatisch aufgerufen wird, wenn sich der User einloggt
— egal ob lokal an der Console oder von einem anderen Rechner
per SSH. Die Login-Shell kann meist mit dem Befehl chsh
geändert werden.
Unter MS-DOS befindet sich der Benutzer nach dem Booten direkt in einer Shell. Unter Windows bekommt man eine Shell meist über das Anwählen des Punktes im Startmenü Eingabeaufforderung.
sh
(Bourne Shell): UNIX V7, 1977/78csh
(C-Shell): 2BSD, 1979ksh
(Korn-Shell): UNIX System V; ksh88 ist
Grundlage des POSIX-Standards.pdksh
(Public Domain Korn-Shell): Freier, aber
nicht vollständiger Rewrite der ksh; Standard-Shell unter
OpenBSD.bash
(GNU Bourne Again Shell): Ende der 80er
entwickelt, steht unter der GPL, Standard-Shell unter vielen
Linux-Distributionen und cygwin.tcsh
(TENEX-C-Shell): Standard-Shell auf vielen
aktuellen BSD-Systemen, Autor ist NetBSD-Entwickler.zsh
(Z-Shell): 1989, Vereint viele Features von
bash, tcsh und ksh. Lange Zeit Standardshell auf Macs.ash
(Almquist Shell): Kompakte und schnelle
Neuentwicklung der Bourne Shell; wird oft auf Embedded
Systemen oder z.B. während der Installation verschiedener
Linux-Distributionen eingesetzt.command.com
: MS-DOScmd.exe
: Windows NT, 2000, XP, 20034DOS
: Ersatz für command.com mit
vielen Feat., u.a. Tab Completioncommand.com
,
cmd.exe
, 4DOS
, etc.)ash
, sh
,
command.com
, cmd.exe
,
4DOS
, etc.).bashrc
,
.cshrc
, .tcshrc
,
.zshrc
sh
, csh
, command.com
ohne doskey
)sh
, csh
, command.com
,
cmd.exe
mit Defaulteinstellungen bis Windows
XP)Bestimmte Tasten bzw. Zeichen haben am Terminal, auf der Kommandozeile oder für Anwendungen besondere Bedeutungen, werden manchmal aber auch ohne diese Sonderbedeutung gebraucht. Sie müssen dann "escaped" oder "gequotet" werden.
Nehmen wir z.B. eine Datei, deren Name aus einem Minus (»-«), einem
Pipe-Zeichen (»|«) und einem Ctrl-C (»^C«) besteht und die wir
umbenennen wollen: mv -|^C foobar
mv
als
Optionen.mv ./-|^C foobar
mv ./-\|^C
foobar
mv ./-\|^V^C
foobar
scp
auf einen
anderen Rechner. → Schlechte Anwendungsprogrammierung.!! Letzte Kommandozeile !3 Dritte Kommandozeile !-2 Vorletzte Kommandozeile !foobar Letzte Kommandozeile, die mit »foobar« begann !# Alles, was bisher in dieser Zeile getippt wurde. !?foobar Letzte Kommandozeile, die »foobar« beinhaltete
:* Alle Parameter, z.B. !!:* :^ Erster Parameter, z.B. !less:^ :$ Letzter Parameter, z.B. !3:$ :2 Zweiter Parameter, z.B. !-2:2 :2-4 Zweiter bis vierter Parameter, z.B. !#:-2
:h entfernt letzte Pfadkomponente, z.B. /foo/bar → /foo :t entfernt Pfad von einer Datei, z.B. /foo/bar → bar :r entfernt letzte Dateiendung, z.B. foo.x.y → :r:r → foo :e entfernt alles bis auf die Dateiendung, z.B. foo.bar → .bar :u Großbuchstaben: tcsh erster, zsh alle :l Kleinbuchstaben: tcsh erster, zsh alle :p Ergebnis nur ausgeben, nicht ausführen :q Ergebnis quoten, keine weiteren Ersetzungen :x Ergebnis quoten, keine weiteren Ersetzungen, Parameter an Blanks aufsplitten :s/a/b/ »a« einmal durch »b« ersetzen :gs/a/b/ Alle »a« durch »b« ersetzen :as/xx/x/ Im ersten Wort solange wie möglich »xx« durch »x« ersetzen (nur tcsh und csh, Gefahr von Endlosschleifen!) :ags/xx/x/ Solange wie möglich »xx« durch »x« ersetzen (tcsh, csh)
!^, !$, !:2, !* Erster, letzter, zweiter bzw. alle Parameter des letzten Befehls. Entspricht !!:^, !!:$, !!:2, !!:* ^a^b Ersetze einmal »a« durch »b« im letzten Befehl. Entspricht !!:s/a/b
Zeilen, die mit einem Leerzeichen beginnen, werden nicht in der History gespeichert. (Nur bash und zsh, optional.)
Mit fc
(für "Fix Command" — "Repariere Kommando")
kann man bereits eingegebene Kommandozeilen editieren und erneut
ausführen. (Nur bash, zsh und ksh.)
fc
: Editiert letztes Kommando in $FCEDIT und
führt es aus.fc -l -10
: Listet die letzten 10 Kommandos
auffc -1 -2
: Editiert die letzten beiden Kommandos
in $FCEDIT und führt sie aus.cd -
cd $owd
/ echo $owd
(tcsh, csh)cd $OLDPWD
/ echo $OLDPWD
(bash,
zsh, ksh, ash)
Funktioniert unter bash
, tcsh
,
zsh
und z.T. auch in der cmd.exe
.
pushd foobar
: Schiebt das aktuelle Verzeichnis
auf den Directory Stack und wechselt in das Verzeichnis
»foobar«. Analog dazu: pushd -
popd
: Entfernt das oberste Verzeichnis vom
Directory Stack und wechselt in dieses.dirs
: Listet die Verzeichnisse im Directory Stack
auf.pushd +1
: Rotiert die Verzeichnisse im Directory
Stack durch Verschieben des obersten, aktuellen Verzeichnis
nach ganz unten und wechselt dann in das bisher zweitoberste
und jetzt oberste Verzeichnis des Stacks. Analog dazu:
pushd +2
, pushd -1
Ctrl-Z
: Hält den aktuell laufenden Job an und
kehrt zur Shell zurück. (Sendet kill -SUSP
an den
Prozeß.)
abc &
: Startet Befehl »abc« und schiebt ihn in den
Hintergrund.
fg %2
: Holt Job Nr. 2 wieder in den Vordergrund
(engl. foreground)bg %3
: Schiebt den angehaltenen Job Nr. 3 in den
Hintergrund (engl. background), damit er dort weiterlaufen
kann.jobs
: Zeigt im Hintergrund laufende und
angehaltene Jobs an.
%%
und %+
: Letzter Job%-
: Vorletzter Job%2
: Zweiter Job%foo
: Letzter Job, der mit »foo« beginnt%?foo
: Letzter Job, der »foo« beinhaltete (nicht
ash)fg %
, %%
, %+
,
fg
(jeweils als Befehl): Kurz für fg
%%
%
: Kurz für fg %%
(Nur bash, tcsh
und zsh)%-
(als Befehl): Kurz für fg %-
%2
(als Befehl): Kurz für fg %2
bg
: Kurz für bg %%
%foo
, %?foo
(jeweils als Befehl):
Kurz für fg %foo
bzw. fg %?foo
type programm
: Gibt aus, ob ein Programm ein
Builtin, Alias oder Befehl ist (nicht tcsh, csh)
which programm
: Gibt aus, wo das Progamm als
erstes gefunden wird (Pfad/Builtin/Alias).where programm
=ls
: Kurzform für `which ls`
(zsh)
Problem: Backquotes (`programm`
oder
$(programm)
) versagen kläglich bei
Leer- oder Sonderzeichen im Dateinamen.
Lösung: find
mit NULL-terminierten Dateinamen und
passendem xargs
: find . -name '*.mp3' -print0 |
xargs -0 mpg321
Problem: sed -e 's/foo/bar/' datei > datei
endet mit Datenverlust.
Lösung: Inline-Edit von Perl oder Super-Sed:
Problem: Man macht umfangreiche Installations- oder Upgrade-Arbeiten in der Shell und will das alles mitprotokollieren.
Lösung: Das Tool script (Paket "bsdutils" bei
Debian) startet eine Subshell und protokolliert jeden In- und Output
in eine Logdatei.
Problem: Da unter Unix die Shell die Wildcards auswertet, geht
mv *.jpg *.jpeg
im Gegensatz zu DOS nicht.
Lösung: Multiple Move (mmv) oder Perl-Skript Rename.
screen
gpm
loco
, colordiff
,
colormake
, colorgcc
cut -c-80
(textutils), less -S
,
less -N
, less +G
, less
+F
, less +/xyz
Letzte Änderung an den Quellen: 2005-09-27 00:06:30
Letzte Generierung: 2005-10-28 00:51:49
Generiert von abe@bijou
mit WML 2.0.8 (30-Oct-2001)