read -t und read -n1 in POSIX

10/02/2009 - 09:31 von Martin Vaeth | Report spam
Hallo,

bei der Konvertierung eines bash-Skripts in POSIX bin ich auf ein
Problem gestossen, fuer das ich keine Skript-Loesung finde:
Bashs read kennt -t (timeout) und -n1 (Ende nach 1 Zeichen),
POSIX aber nicht.
Gibt es in POSIX eine Moeglichkeit zu testen, ob ein Zeichen an stdin
anliegt und/oder dieses zu holen?
Die Alternative fuer -t waere wohl, read asyncron zu starten (um die
Prozess-ID zu bekommen), dann einen Prozess zu starten, der dieses
nach gewisser Zeit killt, und dann read wieder nach vorne zu holen.
Aber dabei ist mir erstens nicht klar, ob dabei garantiert ist, dass read
den urspruenglichen Input wiederbekommt (obwohl das bei dash zumindest so
zu sein scheint), und zweitens weiss ich nicht, wie ich wieder an den
stdout eines "nach vorne geholten" Prozesses komme: A=$(fg) geht nicht,
weil in der Subshell ja kein Prozess gestartet wurde.
Ausser Ausgabe in temporaere Files/FiFos, die fuer eine Tastaturabfrage
aber wirklich unangebracht sind und die ich aus anderen Gruenden ohnehin
vermeiden muss, faellt mir nichts ein.
Kann man in POSIX' Shell wirklich kein read -t emulieren?
Mit read -n1 sieht es wohl noch viel schlimmer aus...

Schoene Gruesse
Martin
 

Lesen sie die antworten

#1 naddy
10/02/2009 - 15:13 | Warnen spam
Martin Vaeth wrote:

Kann man in POSIX' Shell wirklich kein read -t emulieren?
Mit read -n1 sieht es wohl noch viel schlimmer aus...



Letzteres macht man traditionell so:

STTY=`stty -g`
stty -icanon
INP=`dd count=1 bs=1 2>/dev/null`
stty $STTY

Mit "stty min 0 time <timeout>" kann man auch einen Timeout setzen.

Christian "naddy" Weisgerber

Ähnliche fragen