Next: Wenn, dann ...
Up: shell
Previous: shell
Unterabschnitte
Bei vielen Kommandos führt der Aufruf ohne Parameter zu einer Auflistung der Elemente, für die das
Kommando gilt, der Aufruf mit Parametern wendet das Kommando auf diese an. (z. B. readonly
liefert die schreibgeschützten Variablen, readonly x
macht $x
zu einer
schreibgeschützten Variable.
. file
Abkürzung für source
, Datei wird in der gleichen Shell ausgeführt
. .bash
profile_ liest die Profil-Datei neu ein.
cd
echo
eval args
args
einlesen, parsen und ausführen (Textersatz!)
exec args
args
anstelle dieser Shell ausführen (z. B. Windowmanager)
exit code
Shell mit code
als Rückgabewert beenden
export [vars]
Variablen auch an Kindershells vererben bzw. exportierte zeigen (ohne
Args.)
export PATH=$PATH:.
fügt das working directory zum Pfad hinzu
hash [name | -r name]
Pfad von name merken, -r löschen, alles ausgeben
pwd
print working directory
read name
Variablen einlesen (mit IFS zerlegt...)
[britta@Wintermute britta]$read x
hallo
[britta@Wintermute britta]$echo $x
hallo
readonly [name]
Variablen schreibschützen / schreibgeschützte anzeigen
set [opts args]
Variablen setzen / anzeigen
shift [nr]
$1 .. $9
um nr nach links schieben (um an das zehnte, ... Argument
zu kommen - default um 1 verschieben
trap komm signal
bei Signal signal komm ausführen
trap [signal]
Signale anzeigen / löschen
trap `` signal
Signale ignorieren
[britta@Wintermute britta]$trap "echo Ctrl-C" 2
[britta@Wintermute britta]$Ctrl-C
[britta@Wintermute britta]$trap
trap -- 'echo Ctrl-C' SIGINT
[britta@Wintermute britta]$trap `` 2
[britta@Wintermute britta]$trap
type name
welches Kommando ist das?
ulimit [-f blocks]
max. Dateigröße zeigen / setzen
umask [ooo]
Erlaubnis für neue Dateien anzeigen oder auf angegebene Zahl setzen
[britta@Wintermute britta]$touch x
[britta@Wintermute britta]$umask
002
[britta@Wintermute britta]$umask 666
[britta@Wintermute britta]$touch y
[britta@Wintermute britta]$ls -l x y
-rw-rw-r-- 1 britta britta 0 Jun 17 20:31 x
---------- 1 britta britta 0 Jun 17 20:31 y
unset name
Variable / Funktion löschen
[britta@Wintermute britta]$x=hallo
[britta@Wintermute britta]$echo $x
hallo
[britta@Wintermute britta]$unset x
[britta@Wintermute britta]$echo $x
wait [pid]
Ende eines (bestimmten) Prozesses abwarten
[britta@Wintermute britta]$sleep 30s&
[1] 24622
[britta@Wintermute britta]$wait 24622
[1]+ Done sleep 30s
komm1 && komm2
führt komm2
nur aus, wenn komm1
erfolgreich beendet wurde
(Rückgabewert 0). komm1 || komm2
führt komm2
nur aus, wenn komm1
nicht erfolgreich war (Rückgabewert != 0, in $?
gespeichert).
[britta@Wintermute shell]$ tar -xzf shell.tgz && rm -rf shell.tgz
[britta@Wintermute shell]$ tar -xzf shell.tgz || echo "tar korrupt"
test
überprüft, ob Bedingungen zutreffen, und gibt 0 zurück, wenn ja. Sehr nützlich für
Kontrollstrukturen!!! Abkürzung: [ bed ]
(man beachte die Leerzeichen!)
- Strings
test "$x"
: ist $x
belegt?
test -z "$z"
: ist $x
0 Zeichen lang?
test "$x" = "$y"
: stimmen $x
und $y
überein?
test "$x" != "$y"
: weichen $x
und $y
voneinander ab?
- Zahlen
test "$x" -eq "$y"
: $x
== $y
? (equal)
test "$x" -ne "$y"
: $x
!= $y
? (not equal)
test "$x" -gt "$y"
: $x
> $y
? (greater than)
test "$x" -ge "$y"
: $x
$y
? (greater equal)
test "$x" -lt "$y"
: $x
< $y
? (less than)
test "$x" -le "$y"
: $x
$y
? (less equal)
- Dateien (auszugsweise)
test -e "$x"
: existiert die Datei? (exists)
test -d "$x"
: ist es ein Ordner? (directory)
test -f "$x"
: ist es eine einfache Datei (nicht Device, Ordner, ...? (file)
test -L "$x"
: ist es ein symbolischer Link? (link)
test -s "$x"
: ist die Datei mind. ein Byte groß (nicht leer)? (size)
test -r "$x"
: ist die Datei lesbar? (read)
test -w "$x"
: ist die Datei schreibbar? (write)
test -x "$x"
: ist die Datei ausführbar? (execute)
test "$x" -ef "$y"
: hat Datei $x
die gleiche I-Node wie $y
? (equal
file)
test "$x" -nt "$y"
: ist Datei $x
neuer als $y
? (newer than)
- Verknüpfte Bedingungen
test ! cond
: ist cond
nicht erfüllt?
test cond1 -a cond2
: sind cond1
und cond2
erfüllt?
test cond1 -o cond2
: ist mindestens eine von cond1
und cond2
erfüllt?
Es gibt auch die Kommandos true
und false
, eingebaut und extern. :
ist eingebaut
und liefert auch 0 zurück, aber mittlerweile sind true
und false
auch in der bash eingebaut.
[britta@Wintermute shell]$ x=lalala
[britta@Wintermute shell]$ test "$x"
[britta@Wintermute shell]$ echo $?
0
[britta@Wintermute shell]$ test -z "$x"
[britta@Wintermute shell]$ echo $?
1
[britta@Wintermute shell]$ ls -l shell.aux
-rw-r--r-- 1 britta britta 1174 Jun 5 14:26 shell.aux
[britta@Wintermute shell]$ test -f shell.aux
[britta@Wintermute shell]$ echo $?
0
[britta@Wintermute shell]$ test -d shell.aux
[britta@Wintermute shell]$ echo $?
1
[britta@Wintermute shell]$ test -x shell.aux
[britta@Wintermute shell]$ echo $?
1
[britta@Wintermute shell]$ ln -s shell.aux auxshell
[britta@Wintermute shell]$ test auxshell -ef shell.aux
[britta@Wintermute shell]$ echo $?
0
[britta@Wintermute shell]$ test shell.log -ef shell.aux
[britta@Wintermute shell]$ echo $?
1
Runde Klammern forken die aktuelle Shell, d.h. Variablenbelegung etc. werden vererbt. Das ist
z. B. in Makefiles oft der Fall, wenn man verschiedene Verzeichnisse hat:
(cd src && make)
- Variablen wie CFLAGS
etc. werden vererbt. Auch wird dann die
Ausgabe der Kommandos zusammengefaßt: nützlich für Pipes.
Geschweifte Klammern führen ein Kommando meist in der aktuellen Shell aus - das spart einen
Prozeß. Achtung bei Pipes!!!!! Außerdem ist dies bei terminalen Fehlern in Skripten unerläßlich:
test "$allesok" || echo "Fehler!" 1 >&2 ; exit 1
beendet das ganze Programm immer,
test "$allesok" || { echo "Fehler!" 1 >&2 ; exit 1 }
beendet das Programm nur, wenn
$allesok
nicht belegt ist.
Das Problem taucht bei geschweiften Klammern und I/O-Umleitung auf: dann erzeugt die Shell eine
Subshell, um die Umleitung kontrollieren zu können.
[britta@Wintermute shell]$ who
britta tty1 Jun 5 10:10
[britta@Wintermute shell]$ date ; who | wc
Sat Jun 5 14:40:17 CEST 1999
1 5 31
[britta@Wintermute shell]$ (date ; who) | wc
2 11 61
[britta@Wintermute shell]$ cat paren1
test "$1" || echo "Fehler"; exit 1
date
[britta@Wintermute shell]$ paren1
Fehler
[britta@Wintermute shell]$ paren1 bla
[britta@Wintermute shell]$cat paren2
test "$1" || ( echo "Fehler" ; exit 1 ; )
date
[britta@Wintermute shell]$paren2
Fehler
Fri Jun 11 17:28:02 CEST 1999
[britta@Wintermute shell]$paren2 bla
Fri Jun 11 17:28:04 CEST 1999
[britta@Wintermute shell]$
[britta@Wintermute shell]$ cat paren3
test "$1" || { echo "Fehler" ; exit 1 ; }
date
[britta@Wintermute shell]$ paren3
Fehler
[britta@Wintermute shell]$ paren3 bla
Sat Jun 5 14:47:04 CEST 1999
[britta@Wintermute shell] $ cat | { date ; exit 1; }
Fri Jun 11 17:31:33 CEST 1999
Broken pipe
In paren1
wird das exit
außerhalb der Oder-Phrase ausgeführt. Im zweiten Fall wird
nur die Sub-Shell, die durch die runden Klammern entstand, beendet. Der dritte Fall zeigt das
richtige Verhalten, nämlich das Beenden bei Fehlen von Parametern.
Das letzte Kommando zeigt die Gefahr von geschweiften Klammern und Ausgabeumleitung.
Next: Wenn, dann ...
Up: shell
Previous: shell
Britta Koch
1999-06-18