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

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

Теоретически с этим блоком вы должны увидеть "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.

Связанный контент