Изменение переменных в разветвленном процессе извне этой вилки?

Теоретически с этим блоком вы должны видеть только «бег …» один раз (или меньше), но на практике он повторяется до тех пор, пока он не будет убит вручную. Как изменить значение x внутри forked-процесса на false из-за разветвленного процесса после того, как была вызвана функция «start»?

export x=true start() { while [ $x == true ]; do echo running... sleep 1 done } start & x=false 

Простое решение здесь использовать какую-то межпроцессную связь, чтобы сообщить целевому процессу внести изменения. Например, вы можете использовать сигналы:

 #!/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... $ 

Если вы используете ksh93 , вы можете использовать функции дисциплины для реализации общих переменных (см. https://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts -get )

Кроме того, вы можете использовать fish которая реализует эту функцию через демона: fishd .