
Теоретически с этим блоком вы должны увидеть "running..." только один раз (или меньше), но на практике он повторяется, пока не будет вручную завершен. Как изменить значение x внутри разветвленного процесса на false извне разветвленного процесса после вызова функции "start"?
export x=true
start() {
while [ $x == true ]; do
echo running...
sleep 1
done
}
start &
x=false
решение1
Простое решение здесь — использовать некое межпроцессное взаимодействие, чтобы сообщить целевому процессу о необходимости внести изменения. Например, можно использовать сигналы:
#!/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
выдает следующий результат:
$ ./testit.sh
running...
running...
running...
running...
running...
$
решение2
Если вы используете ksh93
, вы можете использовать дисциплинарные функции для реализации общих переменных (см.https://stackoverflow.com/questions/13726293/переменные-окружения-для-использования-в-нескольких-korn-ksh93-shell-scripts-get)
В качестве альтернативы вы можете использовать, fish
который реализует эту функцию через демон:fishd.