Bash Filedeskriptoren: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „==Schreibenden Deskriptor== ;anlegen *exec 5> /tmp/five ;rein schreiben *echo eins >&5 *echo zwei >&5 *echo drei >&5 ;ausgeben *cat /tmp/five ;aufheben *exec…“) |
|||
| (7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | + | = Schreibenden Deskriptor = | |
| + | |||
;anlegen | ;anlegen | ||
*exec 5> /tmp/five | *exec 5> /tmp/five | ||
| + | |||
;rein schreiben | ;rein schreiben | ||
| + | |||
*echo eins >&5 | *echo eins >&5 | ||
*echo zwei >&5 | *echo zwei >&5 | ||
*echo drei >&5 | *echo drei >&5 | ||
| + | |||
;ausgeben | ;ausgeben | ||
| + | |||
*cat /tmp/five | *cat /tmp/five | ||
| + | |||
;aufheben | ;aufheben | ||
| + | |||
*exec 5>&- | *exec 5>&- | ||
| + | |||
;führt zu Fehler | ;führt zu Fehler | ||
| + | |||
*echo vier >&5 | *echo vier >&5 | ||
| − | + | ||
| + | = Lesender Deskriptor = | ||
| + | |||
;anlegen | ;anlegen | ||
| + | |||
*exec 7< /etc/hosts | *exec 7< /etc/hosts | ||
| + | |||
;auslesen | ;auslesen | ||
| + | |||
*cat <&7 | *cat <&7 | ||
| + | |||
;geht nur einmal | ;geht nur einmal | ||
| + | |||
*cat <&7 | *cat <&7 | ||
| − | + | = Gleichzeitiges Lesen aus verschiedenen Dateien = | |
| − | <syntaxhighlight> | + | |
| + | <syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
exec 3< /etc/passwd | exec 3< /etc/passwd | ||
exec 4< /etc/shadow | exec 4< /etc/shadow | ||
while true | while true | ||
| − | + | do | |
read var3 <&3 | read var3 <&3 | ||
| − | read var4 | + | read var4 <&4 |
| − | echo passwd | + | echo passwd $var3 |
| − | echo shadow $var4 | + | echo shadow $var4 |
test -z $var4 && break | test -z $var4 && break | ||
| − | + | done | |
</syntaxhighlight> | </syntaxhighlight> | ||
| − | + | ||
| − | <syntaxhighlight> | + | = Gleichzeitiges Lesen aus Datei und Standardeingabe = |
| + | |||
| + | <syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
exec 3< $1 | exec 3< $1 | ||
| Zeile 46: | Zeile 65: | ||
done | done | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | |||
| + | = Aufgabe = | ||
| + | |||
| + | * Schreiben Sie ein Dummy Programm, das jede Sekunde zufällig entweder ''Log'', ''Warning'' oder ''Error'' ausgibt | ||
| + | * Benutzen Sie dafür die Umgebungsvariable $RANDOM: | ||
| + | ** Wenn $RANDOM kleiner ist als 15000, dann soll es eine Log-Nachricht auf Kanal 4 sein. | ||
| + | ** Wenn $RANDOM kleiner ist als 25000, dann soll es eine Warn-Nachricht auf Kanal 3 sein. | ||
| + | ** Sonst soll es eine Fehler-Nachricht auf STDERR sein. | ||
| + | * Um die Nachrichten voneinander zu unterscheiden, soll das Datum und die Uhrzeit daneben stehen | ||
| + | |||
| + | <!-- #!/bin/bash --> | ||
| + | |||
| + | <!-- rm /tmp/log --> | ||
| + | <!-- rm /tmp/warn --> | ||
| + | |||
| + | <!-- exec 4> /tmp/log --> | ||
| + | <!-- exec 3> /tmp/warn --> | ||
| + | |||
| + | <!-- while true; do --> | ||
| + | <!-- seed=$RANDOM --> | ||
| + | <!-- t="["$(date +"%D %H:%M:%S")"]:" --> | ||
| + | <!-- if [ $seed -lt 15000 ]; then --> | ||
| + | <!-- msg="Log" --> | ||
| + | <!-- echo "$t" "$msg Message" >&4 --> | ||
| + | <!-- elif [ $seed -lt 25000 ]; then --> | ||
| + | <!-- msg="Warning" --> | ||
| + | <!-- echo "$t" "$msg Message" >&3 --> | ||
| + | <!-- else --> | ||
| + | <!-- msg="Error" --> | ||
| + | <!-- echo "$t" "$msg Message" >&2 --> | ||
| + | <!-- fi --> | ||
| + | <!-- sleep 1 --> | ||
| + | <!-- done --> | ||
Aktuelle Version vom 31. Mai 2023, 14:03 Uhr
Schreibenden Deskriptor
- anlegen
- exec 5> /tmp/five
- rein schreiben
- echo eins >&5
- echo zwei >&5
- echo drei >&5
- ausgeben
- cat /tmp/five
- aufheben
- exec 5>&-
- führt zu Fehler
- echo vier >&5
Lesender Deskriptor
- anlegen
- exec 7< /etc/hosts
- auslesen
- cat <&7
- geht nur einmal
- cat <&7
Gleichzeitiges Lesen aus verschiedenen Dateien
#!/bin/bash
exec 3< /etc/passwd
exec 4< /etc/shadow
while true
do
read var3 <&3
read var4 <&4
echo passwd $var3
echo shadow $var4
test -z $var4 && break
done
Gleichzeitiges Lesen aus Datei und Standardeingabe
#!/bin/bash
exec 3< $1
while read line <&3
do
echo $line
printf "Eine weitere Zeile einlesen? [j/n] : "
read REPLY
test "$REPLY" = "n" && break
done
Aufgabe
- Schreiben Sie ein Dummy Programm, das jede Sekunde zufällig entweder Log, Warning oder Error ausgibt
- Benutzen Sie dafür die Umgebungsvariable $RANDOM:
- Wenn $RANDOM kleiner ist als 15000, dann soll es eine Log-Nachricht auf Kanal 4 sein.
- Wenn $RANDOM kleiner ist als 25000, dann soll es eine Warn-Nachricht auf Kanal 3 sein.
- Sonst soll es eine Fehler-Nachricht auf STDERR sein.
- Um die Nachrichten voneinander zu unterscheiden, soll das Datum und die Uhrzeit daneben stehen