abe@debian.org
http://noone.org/abe/
chsh
geändert
werden.
sh
(Bourne Shell): UNIX V7, 1977/78csh
(C-Shell): 2BSD, 1979ksh
(Korn-Shell): UNIX System V; ksh88/ksh93 ist
Grundlage des POSIX-Standards. Mittlerweile freie Software.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 Standard-Shell auf Macs.pdksh/oksh
(Public Domain/OpenBSD Korn-Shell):
Freier, aber nicht vollständiger Rewrite der ksh;
Standard-Shell unter OpenBSD. Entwicklung eingeschlafen.mksh
(MirBSD Korn-Shell): Performante,
standard-konforme, portable Korn-Shell; Fork von pdksh/oksh;
Standard-Shell unter MirBSD, FreeWRT, MidnightBSD und
Android.ash
(Almquist Shell): Kompakte und schnelle
Neuentwicklung der Bourne Shell; wird als Bestandteil von
Busybox oft auf Embedded Systemen oder z.B. während der
Installation verschiedener Linux-Distributionen
eingesetzt.dash
(Debian Almquist Shell): Fork der ash,
Stellt /bin/sh auf Debian (ab Squeeze 6.0) und Ubuntu (ab Edgy
Eft 6.10).sash
(Stand-Alone Shell): Shell, die die
wichtigsten Befehle eingebaut hat. (Rettungsshell)ash
, sh
,
DOS/Windows, ohne TTY).bashrc
, .cshrc
,
.tcshrc
, .zshrc
sh
, csh
, command.com
ohne doskey
)sh
, csh
, command.com
,
cmd.exe
mit Defaultkonfig. bis WinXP)mkdir dir; mv foo dir; cd dir
mv foo bar && head bar
grep foo bar || echo bar in foo nicht
gefunden
grep foo bar > foos-in-bar
grep foo2 bar >> foos-in-bar
tail -f foo | grep bar
ftp < ftp-kommandos.txt
cat ftp-kommandos.txt | ftp
ogg123 `find . -name '*.ogg'`
(ohne Quoting nicht
schachtelbar)ogg123 $(find . -name '*.ogg')
(nicht csh,
tcsh)find . -name '*.ogg' | xargs ogg123
find . -name '*.ogg' -print0 | xargs -0
ogg123
$ while true; do echo -n .; sleep 1; done; $ while :; do echo -n .; sleep 1; done; $ until false; do echo -n .; sleep 1; done;
$ for i in 1 2 3 4 5 6; do echo $i; sleep 1; done; $ for i in `seq 1 6`; do echo $i; sleep 1; done; $ for i in {1..6}; do echo $i; sleep 1; done # (nicht mksh, pdksh) $ for ((i=1; i<=6; i++)); do echo $i; done # (nicht mksh, pdksh)
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.
> while (1) while? echo -n .; sleep 1; while? end > while ({true}) while? echo -n .; sleep 1; while? end > foreach i (1 2 3) foreach? echo $i; sleep 1; foreach? end
history | grep foobar
und dann Cut & Paste (meist mit der Maus)
!! 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 :0 Letztes Programm ohne Parameter, z.B. !:0
: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 Leerzeichen 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
$ tar cvf foobar-1.2.3woody4_i386.tar foobar $ gzip -9v foobar-1.2.3woody4_i386.tar $ mv foobar-1.2.3woody4_i386.tar.gz foobar-1.2.3woody4_i386.tgz $ mkdir backup $ mv foobar-1.2.3woody4_i386.tgz backup $ mv backup Backup $ cd Backup $ tar cvf foobar-1.2.3woody4_i386.tar foobar $ gzip -9v !:2 $ mv !$.gz !$:r.tgz $ mkdir backup $ mv !mv:$ !$ $ mv !$ !$:s/b/B $ cd !$
Zeilen, die mit einem Leerzeichen beginnen, werden nicht in der History gespeichert. (Nur bash und zsh, optional.)
bash $ HISTCONTROL=ignorespace zsh $ setopt HIST_IGNORE_SPACE $ echo foo foo $ echo bar bar $ !! echo foo foo
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«.popd
: Entfernt das oberste Verzeichnis vom
Directory Stack und wechselt in dieses.dirs
: Listet die Verzeichnisse im Directory Stack
auf.pushd +1
: Rotiert durch die Verzeichnisse im Directory
Stack 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)%-
: Kurz für fg %-
%2
: Kurz für fg %2
bg
: Kurz für bg %%
%foo
, %?foo
(jeweils als Befehl):
Kurz für fg %foo
bzw. fg %?foo
mv Ein Lied.ogg Ein-Lied.ogg
→mv Ein\ Lied.ogg Ein-Lied.ogg
odermv 'Ein Lied.ogg' Ein-Lied.ogg
odermv "Ein Lied.ogg" Ein-Lied.ogg
odermv Ein' 'Lied.ogg Ein-Lied.ogg
odermv Ei'n L'ied.ogg Ein-Lied.ogg
fgrep -rc Changelog
→fgrep -- -rc Changelog
-rf .
"?rm ./-rf\ .
oderrm './-rf .'
oderrm "./-rf ."
echo <Ctrl-C> muß man auch quoten können.
→echo <Ctrl-V><Ctrl-C> muß man auch quoten können.
echo <Ctrl-V><Ctrl-C> muss man auch irgendwie quoten.
Ein <Ctrl-Q><Ctrl-C> muss man auch irgendwie quoten.
<Ctrl-V><Ctrl-C> muss man auch im Insert-Modus irgendwie quoten.
Ein <Ctrl-C> muss man im Insert-Modus nicht extra quoten.
Control-v: quoted-insert
bindkey -b ^v quoted-insert
(global-set-key "\C-q" 'quoted-insert)
^]
kann nicht gequotet werden, aber mit der Option -E
ganz abgeschaltet werden.~
muss in einer ssh-Session am Zeilenanfang durch ~~
(bei toter Tilde mit ~<Leerzeichen>~<Leerzeichen>
) gequotet werden, falls sie zusammen mit dem nächsten Tastendruck ein ssh-Kommando (z.B. ~?
oder ~^Z
) ergibt.^A
muss in einem Screen durch <Ctrl-A> <A>
gequotet werden.set -f
(bash/ksh/sh), set -F
oder noglob kommando *
(beides zsh) oder $noglob
(tcsh)"…"
verhindert die Interpretation von Wildcards, Ein- und Ausgabe-Umleitung, einfachen Anführungszeichen, Leerzeichen, Tab und Zeilenumbruch.'…'
verhindert die besondere Interpretation aller Zeichen (inkl. Backslash) ausser einfachen Anführungszeichen selbst, d.h. '\''
geht nicht. (Ausnahme: Quotet kein Ausrufezeichen in der tcsh → History-Expansion dort auch innerhalb von einfachen Anführungszeichen.)./-
statt -
für Dateien, die mit Minus beginnen: mv ./-foo foo
--
als Abschluss der Optionen-Liste (u.a. GNU Utilities): fgrep -- -rc Changelog
./
vor Dateinamen mit Doppelpunkt bei scp und tar: tar cvzf ./bla:fasel.tgz blafasel; scp ./bla:fasel.tgz host:bla:fasel.tgz
ssh rechner cat bla '>' foo
oderssh rechner 'cat bla > foo'
Wir wollen eine Datei umbenennen, deren Name aus einem Minus
(»-«), einer Pipe (»|«) und einem Ctrl-C
(»^C«) besteht: mv -|^C foobar
mv
als Optionen.mv ./-|^C foobar
mv ./-\|^C foobar
mv ./-\|^V^C foobar
"`…`"
oder "$VAR"
)type programm
: Gibt aus, ob ein Befehl ein
Builtin, Alias oder Programm ist (nicht tcsh, csh)
which programm
: Gibt erste Fundstelle des Befehls
aus. (Programm-Pfad/Builtin/Alias; nicht bash →
/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,
opt., vgl. mutt -f =adam
)
pwd -P
, pwd -L
: Akt. Verz. ohne/mit
Symlink (bash, ksh, zsh)kill %job
: Job mit Bezeichnungen wie bei Job
Control killen (nur tcsh, zsh), sonst PID notwendig.$ alias -g T='| tail' $ fgrep bla /var/log/messages T $ alias -g SUS='| sort | uniq -c | sort -n' $ awk '{print $1}' /var/log/messages SUS $ alias -g ...='../..' $ cd ...
Achtung! Bei unvorsichtiger Verwendung gefährlich! → In den meisten Fällen lieber Funktionen oder Shellskripte machen.
Problem: sed -e 's/foo/bar/' datei > datei
endet mit Datenverlust.
Lösung: Option Inline-Edit (bei Perl, ssed oder neuerem GNU sed):
$ sed -e 's/foo/bar/' -i datei $ perl -pe 's/foo/bar/' -i datei
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:
grep bla access.log | tee bla.log
grep bla access.log 2>&1 | tee bla.log
(sh, bash, zsh, ksh, etc.)grep bla access.log |& tee bla.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: Diverse Tools: (p)rename aus "perl"; rename.ul aus "util-linux"; qmv, qcp, imv, icp und deurlname aus "renameutils".
$ mmv '*.jpg' '#1.jpeg' $ mmv '*---*' '#1 - #2' $ prename 's/jpg$/jpeg/' *.jpg $ prename 's/_/ /g' *.ogg $ rename.ul jpg jpeg *.jpg $ rename.ul Wierd Weird *.ogg $ qmv *.ogg $ qcp *.jpg $ for i in *.ogg; do imv $i; done $ for i in *.jpg; do icp $i; done $ deurlname bla%20foo → "bla foo" $ convmv -f latin1 -t utf-8 *.ogg $ mrename '*.jpg' prefix # a.jpg b.jpg → prefix1a.jpg prefix2b.jpg
screen
screen -ls
screen -r
screen
-r -d
(… und ausloggen mit -D
statt
-d
)screen -R
screen -R -D
screen
-x
Ctrl-A a
: "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 ␣
, Ctrl-A n
,
Ctrl-A Ctrl-N
: Nächstes FensterCtrl-A ↤
, 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
/ Ctrl-A "
: Fensterliste
anzeigen / zum auswählenCtrl-A Shift-S
, Ctrl-A |
: Fenster
aufteilenCtrl-A Tab
: Zwischen aufgeteilten Fenstern
wechselnCtrl-A Shift-Q
: Aktuelles Fenster als einziges
anzeigenCtrl-A [
, Ctrl-A Ctrl-[
:
Copy&Paste starten, Block mit c
Ctrl-A ]
, Ctrl-A Ctrl-]
: PasteCtrl-A h
: Screenshot ("Hardcopy")ncdu
, xdu
, xdiskusage
buthead
, since
/logtail
,
multitail
, inotail
loco
/ccze
/colortail
,
colordiff
, colormake
,
colorgcc
cut -c-80
(textutils), gpm
less -S
, less -N
, less
+G
, less +F
, less +/xyz