1

Я пытаюсь запустить функцию из моего bashrc, которая обновляется каждую минуту и выводит переменную. Это выглядит так:

export CFN = ''
_some_fn
{
    export CFN = 'test'
    sleep 60
    _some_fn &
}
_some_fn &

Где 'test' является переменной, но когда я ее получаю, у меня нет доступа к CFN изнутри функции, что, как я подозреваю, связано с тем, что она работает в подоболочке. Есть ли способ изменить значение CFN, который был экспортирован?

1 ответ1

2

Это невозможно с вашей текущей функцией, как только вы добавите фоновое изображение & он получит копию стека процессов и уйдет. Изменения в вашем стеке не смогут распространиться на копию задания, если вы явно не создадите эту функциональность, и аналогичным образом невозможно внести изменения в стек функции в ваш текущий стек.

Вы можете настроить межпроцессное взаимодействие, чтобы изменить переменную, но это всегда сложно сделать правильно, и я не уверен, каков ваш вариант использования. Пример МПК в обе стороны:

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 ), но я не видел много сценариев оболочки, которые бы использовали их.

Ваша последняя альтернатива - оставить все как есть и заставить ваш скрипт работать, не запуская его в качестве фонового задания, чтобы вы могли настроить среду во время ее работы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .