
Theoretisch sollte bei diesem Block „running...“ nur einmal (oder weniger) angezeigt werden, aber in der Praxis wiederholt es sich, bis es manuell beendet wird. Wie ändere ich den Wert von x innerhalb des gegabelten Prozesses von außerhalb des gegabelten Prozesses auf „false“, nachdem die Funktion „start“ aufgerufen wurde?
export x=true
start() {
while [ $x == true ]; do
echo running...
sleep 1
done
}
start &
x=false
Antwort1
Die einfache Lösung besteht darin, eine Art Interprozesskommunikation zu verwenden, um dem Zielprozess mitzuteilen, dass er die Änderung vornehmen soll. Sie könnten beispielsweise Signale verwenden:
#!/bin/sh
export x=true
start() {
trap x=false USR1
while [ $x = "true" ]; do
echo running...
sleep 1
done
}
start &
sleep 5
kill -USR1 $!
wait
erzeugt diese Ausgabe:
$ ./testit.sh
running...
running...
running...
running...
running...
$
Antwort2
Wenn Sie verwenden ksh93
, können Sie Disziplinfunktionen verwenden, um gemeinsame Variablen zu implementieren (siehehttps://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get)
Alternativ können Sie Folgendes verwenden, fish
das diese Funktion über einen Daemon implementiert:Fischd.