2017-02-04 20 views
0

Betrachtet man das folgende Beispiel zur Verfügung steht, einen Befehl zu emulieren, die Ausgabe nach 10 Sekunden gibt: exec 5< <(sleep 10; pwd)Linux: überprüfen, ob Dateideskriptor zum Lesen

In Solaris, wenn ich den Dateideskriptor überprüfe früher als 10 Sekunden, kann ich sehen, dass es eine Größe von 0 hat und dies sagt mir, dass es noch nicht mit Daten gefüllt wurde. Ich kann einfach jede Sekunde überprüfen, bis die Datei Testbedingung (ungleich 0) erfüllt ist, und dann die Daten ziehen:

while true; do 
    if [[ -s /proc/$$/fd/5 ]]; then 
     variable=$(cat <&5) 
     break 
    fi 
    sleep 1 
done 

Aber in Linux kann ich nicht tun, um diesen (RedHat, Debian usw.). Alle Dateideskriptoren werden mit einer Größe von 64 Byte angezeigt, unabhängig davon, ob sie Daten enthalten oder nicht. Für verschiedene Befehle, die eine variable Zeit benötigen, um ihre Ausgabe zu dumpen, weiß ich nicht, wann ich den Dateideskriptor lesen sollte. Nein, ich möchte nicht nur auf cat <&5 warten, bis ich fertig bin, ich muss wissen, wann ich die cat an erster Stelle durchführen soll. Weil ich diesen Mechanismus verwende, um gleichzeitige Befehle auszugeben und ihre Ausgabe den entsprechenden Dateideskriptoren zuzuweisen. Wie bereits erwähnt, funktioniert das bei Solaris sehr gut. Hier

Antwort

3

ist das Skelett einer Idee:

#!/bin/bash 
exec 5< <(sleep 4; pwd) 
while true 
do 
    if 
    read -t 0 -u 5 dummy 
    then 
    echo Data available 
    cat <&5 
    break 
    else 
    echo No data 
    fi 
    sleep 1 
done 

Von dem Bash-Referenzhandbuch:

Wenn Timeout 0 ist, lesen Sie kehrt sofort, ohne zu versuchen, und Daten zu lesen. Der Exit-Status ist 0, wenn die Eingabe für die angegebene Datei Deskriptor nicht 0 ist.

Die Idee ist, mit -t 0 lesen zu verwenden (Null-Timeout haben) und -u 5 (gelesen von Dateideskriptor 5) für Datenverfügbarkeit sofort zu überprüfen.

Natürlich ist dies nur eine Spielzeugschleife, um das Konzept zu demonstrieren.

+0

Funktioniert perfekt, danke. Ich wusste, dass "lesen" in der Lage ist, ... aus einem Dateideskriptor zu lesen, aber nie darüber nachgedacht hat, was "-t" tun würde. Ich habe die 'Dummy'-Variable eliminiert, da sie nicht gefüllt wird, selbst wenn Daten verfügbar sind und die Syntax ohne sie funktioniert. –

Verwandte Themen