
Я пытаюсь запустить функцию из моего bashrc, которая обновляется каждую минуту и выносит переменную во внешнюю среду. Выглядит это так:
export CFN = ''
_some_fn
{
export CFN = 'test'
sleep 60
_some_fn &
}
_some_fn &
Где 'test' - это переменная, но когда я получаю это, у меня нет доступа к CFN изнутри функции, что, как я подозреваю, связано с тем, что она работает в подоболочке. Есть ли способ изменить значение CFN, которое было экспортировано?
решение1
Это невозможно с вашей текущей функцией, как только вы переводите ее в фоновый режим, &
она берет копию стека процесса и уходит. Нет способа, чтобы изменения в вашем стеке распространились на копию задания, если вы явно не создаете эту функциональность, и также невозможно внести изменения в стек функции в ваш текущий стек.
Вы можете настроить межпроцессное взаимодействие для изменения переменной, но это всегда довольно сложно сделать правильно, и я не уверен, какой у вас вариант использования. Пример IPC в обоих направлениях:
mkfifo -m 600 /var/tmp/cfn-to-fn
mkfifo -m 600 /var/tmp/cfn-from-fn
export CFN = ''
_some_fn
{
read CFN < /var/tmp/cfn-to-fn
# do something with the new CFN here
echo 'processed data' >/var/tmp/cfn-from-fn
_some_fn &
}
_some_fn &
echo 'processme' > /var/tmp/cfn-to-fn
cat /var/tmp/cfn-from-fn
Существует множество альтернатив mkfifo, как правило, все они упоминаются под тегомМежпроцессного взаимодействия. Если вы находите преимущество в том, чтобы все было просто, не беспокойтесь об этом и просто записывайте данные в файл на одном конце и читайте их на другом. D-Bus — это большая шина IPC в большинстве систем Unix, наряду с TCP/ или UDP/IP (с netcat
или nc
), но я не видел много скриптов оболочки, которые их используют.
Последняя альтернатива — оставить все как есть и заставить свой скрипт работать, не запуская его в фоновом режиме, чтобы можно было настраивать среду по мере его выполнения.