Bash Filedeskriptoren: Unterschied zwischen den Versionen

Aus Xinux Wiki
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==
+
= 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==
+
 
 +
= 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==
+
= 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  
+
do  
 
   read var3 <&3  
 
   read var3 <&3  
   read var4 <&4  
+
   read var4 <&4  
   echo passwd $var3
+
   echo passwd $var3
   echo shadow $var4 ;
+
   echo shadow $var4
 
   test -z $var4 && break  
 
   test -z $var4 && break  
done
+
done
 
</syntaxhighlight>
 
</syntaxhighlight>
==Gleichzeitiges Lesen aus Datei und Standardeingabe==
+
 
<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