COSIN 2006
8. Juli 2006
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)mkdir dir; mv foo
dir; cd dir
mv foo bar && head bar
grep foo bar || echo bar in foo nicht
gefunden
grep foo bar >
bars-in-foo
grep foo2 bar
>> bars-in-foo
tail -f foo | grep
bar
ftp <
ftp-kommandos.txt
cat ftp-kommandos.txt | ftp
mpg123 `find . -name '*.mp3'`
(nicht
schachtelbar)mpg123 $(find . -name '*.mp3')
(nicht csh,
tcsh)find . -name '*.mp3' | xargs mpg123 -Z
find . -name '*.mp3' -print0 | xargs -0
mpg123
>while true; do echo -n .; sleep 1; done;
>until false; do echo -n .; sleep 1; done;
>for i in 1 2 3; do echo $i; sleep 1; done
>for (( i=1 ; i < 4 ; i++ )) ; do echo $i ; done
(nicht ksh)
Die Schlüsselkommandos while (...)
, for
(...)
, foreach (...)
und end
müssen jeweils in einer eigene Zeile stehen. In der History
wird jeweils nur die erste Zeile des Kommandos
gespeichert. Die mehrfache Verwendung einer (t)csh-Schleife
auf der Kommandozeile ist daher nicht möglich.
>while (1)
while?echo -n .; sleep 1;
while?end
>foreach i (1 2 3)
foreach?echo $i; sleep 1;
foreach?end
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
mv -v ./-bla foobar
oder scp
./foo:bar www:
.!! 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 (head) entfernt letzte Pfadkomponente, z.B. /foo/bar → /foo :t (tail) entfernt Pfad von einer Datei, z.B. /foo/bar → bar :r (root) entfernt letzte Dateiendung, z.B. foo.x.y → :r:r → foo :e (extenstion) Dateiendung, z.B. foo.bar → .bar :u Großbuchstaben (nur tcsh und zsh): tcsh erster, zsh alle :l Kleinbuchstaben (nur tcsh und zsh): 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 anschließend aus.Ctrl-R
Ctrl-R
möglich mit bindkey ^R
i-search-back
Meta-P
(rückwärts) und Meta-N
(vorwärts), bei FreeBSD per Default auch mit "Cursor hoch"
(erreichbar mit bindkey up
history-search-backward
)Control-Meta-Minus
(M-^-
, funktioniert
wie !#$
bei der History Expansion)Meta-_
(M-_
, funktioniert wie
!$
bei der History Expansion, bash auch
Meta-.
bzw. M-.
)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
>ls
foo.a foo.b foo.b~ foo.c foo.c~ >ls foo.[ab]
foo.a foo.b >ls *[^~]
foo.a foo.b foo.c >unset nonomatch
>touch bar.[fg]
touch: No match. >set nonomatch
>touch bla.[fg]
>touch fnord.{f,g}
>ls
bla.[fg] fnord.f fnord.g foo.a foo.b foo.b~ foo.c foo.c~
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 Befehl ein
Builtin, Alias oder Programm ist (nicht tcsh, csh)
which programm
: Gibt aus, wo der Befehl als
erstes gefunden wird (Programm-Pfad/Builtin/Alias; nicht bash,
dort /usr/bin/which
).where programm
:
Gibt alle Vorkommen des Programmes im Pfad aus
bzw. ob es ein Alias oder Builtin ist. (tcsh, zsh;
sonst: /usr/bin/whereis
)=ls
: Kurz für `which ls`
(zsh,
abschaltbar, vgl. mutt -f =adam
)
pwd -P
, pwd -L
: Aktuelles
Verzeichnis ohne und mit Symlink (nur bash,
ksh, zsh)kill %job
: Job mit Bezeichnungen wie bei Job
Control killen (nur tcsh, zsh), sonst PID notwendig.Achtung! Bei unvorsichtiger Verwendung gefährlich!
Problem: sed -e 's/foo/bar/' datei > datei
endet mit Datenverlust.
Lösung: Option Inline-Edit (bei Perl, ssed oder neuerem GNU sed):
Problem: Man will einerseits direkt die Ausgabe eines Befehls sehen, aber auch in eine Datei mitloggen.
Lösung: Output durch tee dateiname
(Mnemonic:
T-Kreuzung) pipen:
fgrep 127.0.0.1 /var/log/access.log | tee
localhost.log
fgrep 127.0.0.1 /var/log/access.log 2>&1 |
tee localhost.log
(sh, bash, zsh, ksh, etc.)fgrep 127.0.0.1 /var/log/access.log |& tee
localhost.log
(tcsh, csh).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. Erzeugtes Protokoll kann mit
scriptreplay
wieder abgespielt werden.
Problem: Da unter Unix die Shell die Wildcards auswertet, geht
mv *.jpg *.jpeg
im Gegensatz zu DOS nicht.
Lösung: Multiple Move (mmv) oder "rename" (Debian: Paket "perl").
screen
screen
-ls
screen -r
screen
-r -d
screen -R
screen -R -D
screen
-x
Ctrl-A a
: Ein "Ctrl-A" eingeben (z.B. zum
Zeilenanfang gehen)Ctrl-A ?
: Hilfe / Anzeige der
TastaturkommandosCtrl-A C
/ Ctrl-A Ctrl-C
: Neues
Fenster mit ShellCtrl-A Ctrl-A
: Zurück zu letztem FensterCtrl-A Space
/
Ctrl-A n
/ Ctrl-A Ctrl-N
: Nächstes
FensterCtrl-A Backspace
/ Ctrl-A p
/
Ctrl-A Ctrl-P
: Vorheriges FensterCtrl-A 0
/ Ctrl-A 1
/ etc.: Gehe zu Fenster
0, 1, etc.Ctrl-A d
/ Ctrl-A Ctrl-D
: Detach
screenCtrl-A x
/ Ctrl-A Ctrl-X
: Lock
screenCtrl-A t
/ Ctrl-A Ctrl-T
: Uhrzeit
und Load anzeigenCtrl-A Shift-A
: Fenstertitel setzenCtrl-A w
: Fensterliste anzeigenCtrl-A "
: Auswahlliste aller Fenster mitsamt
Titel anzeigenCtrl-A Shift-S
: Fenster aufteilenCtrl-A Tab
: Zwischen aufgeteilten Fenstern
wechselnCtrl-A Shift-Q
: Aktuelles Fenster als einziges
anzeigenCtrl-A [
/ Ctrl-A Ctrl-[
: Copy &
Paste starten. Anfang und Endpunkt jeweils mit
Enter
markieren, Navigation mit Cursortasten,
Block mit c
und C
)Ctrl-A ]
/ Ctrl-A Ctrl-]
: PasteCtrl-A h
: Screenshot ("Hardcopy")mrename
, convmv
und Paket renameutils:
deurlname
, imv
, qmv
buthead
, since
/logtail
,
multitail
loco
/ccze
, colordiff
,
colormake
, colorgcc
cut -c-80
(textutils), gpm
less -S
, less -N
, less
+G
, less +F
, less +/xyz
Letzte Änderung an den Quellen: 2006-07-08 18:57:47
Letzte Generierung: 2006-07-08 18:59:19
Generiert von abe@bijou
mit WML 2.0.8 (30-Oct-2001)
$Id: shell-efficiency-froscon2006.wml 85 2006-06-25 19:08:14Z abe $