Ich weiß, dass ich warten kann, bis die Bedingung erfüllt ist, indem ich Folgendes tue:
while true; do
test_condition && break
sleep 1
done
Es wird jedoch bei jeder Iteration (Ruhezustand) ein Unterprozess erstellt. Ich könnte sie vermeiden, indem ich tue:
while true; do
test_condition && break
done
Aber es verbraucht viel CPU (beschäftigt warten). Um Unterprozesse und zu lange Wartezeiten zu vermeiden, habe ich die folgende Lösung gefunden, die ich jedoch als hässlich empfinde:
my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo # Create an empty fifo for sleep by read.
exec 3<> $my_tmp_dir/fifo # Open the fifo for reading and writing.
while true; do
test_condition && break
read -t 1 -u 3 var # Same as sleep 1, but without sub-process.
done
exec 3<&- # Closing the fifo.
rm $my_tmp_dir/fifo; rmdir $my_tmp_dir # Cleanup, could be done in a trap.
Hinweis: Im Allgemeinen kann ich nicht einfach verwenden read -t 1 var
ohne das FIFO , da es stdin verbraucht und nicht funktioniert, wenn stdin kein Terminal oder keine Pipe ist.
Kann ich auf elegantere Weise Teilprozesse und eifriges Warten vermeiden?
true
, Frage aktualisiert.
read -t 1 var
.
sleep
wie im ersten Beispiel vorzugehen. Die zweite, auch wenn sie funktioniert, wird in Zukunft für niemanden leicht zu ändern sein. Einfacher Code hat auch ein größeres Potenzial für die Sicherheit.
true
ist ein Builtin und erzeugt in bash keinen Subprozess. Das Warten wird immer schlecht sein.