wc:

lpcount:


test.sh:
test.sh.ok:

$ diff test.sh test.sh.ok
1c1
< #/bin/sh
---
> #!/bin/sh
4c4
<       echo usage: `basename $0` <positive number> && exit 1
---
>       echo usage: `basename $0` \<positive number\> && exit 1
8,9c8,9
< [ $1 -lt 0] && usage()
< [ $1 -lt 2] && echo 1 && return
---
> [ $1 -lt 0 ] && usage
> [ $1 -lt 2 ] && echo 1 && return
12,15c12,15
< while : do
<       n=`expr $n * $jog`
<       jog=`expr $jog + 1'
<       [ $jog -gt $1 ] & break;
---
> while :;do
>       n=`expr $n \* $jog`
>       jog=`expr $jog + 1`
>       [ $jog -gt $1 ] && break;
21c21
< fori in 1 2 3 4 5 6 7 8 9 10 11       \
---
> for i in 1 2 3 4 5 6 7 8 9 10 11      \
23c23
<       echo '$i! =' `calc $i`
---
>       echo "$i! =" `calc $i`


a)
Mit n>&- wird der Filedeskriptor n geschlossen. Damit geht ein write(n,....) im Gegensatz zum zweiten Beispiel schief.

b)
Bei dem super user sollte der aktuelle Katalog nicht im Suchpfad sein, um Trojanische Pferde zu vermeiden. Die Idee ist, daß ein böser Benutzer in einem allgemeinen Katalog wie /tmp eine ausführbare Datei wie z.B. ls hinterlegt. Befindet sich der super user irgendwann in dem Katalog und ruft ls auf, so wird /tmp/ls ausgeführt. Dieses Programm könnte nun die ganze Platte löschen oder in dem Heimatkatalog des bösen Benutzers eine Kopie der Shell mit s-Bit erzeugen. Damit wäre der Benutzer quasi super user.