next up previous
Next: Wenn, dann ... Up: shell Previous: shell

Unterabschnitte

Eingebaute und wichtige Kommandos

Eingebaute Kommandos

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.

,,Und'' und ,,Oder''

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

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!) 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

Klammern aller Arten

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 up previous
Next: Wenn, dann ... Up: shell Previous: shell
Britta Koch
1999-06-18