Переменные не сохраняются после использования команды ожидания с функцией в BASH - PullRequest
0 голосов
/ 07 января 2020

Я должен регистрировать измерения от различных датчиков, некоторые из которых занимают довольно много времени. Я хочу получить показания датчиков одновременно, чтобы сэкономить время.

У меня есть функция foo , которая считывает некоторые датчики и сохраняет значения в виде переменных, например, переменную с именем bar .

Я использую команду wait , чтобы приостановить выполнение сценария до завершения функции foo до получения HTTP-запроса на отправку всех измерений на сервер. для ведения журнала.

#!/bin/bash

function foo {
    bar=$(command for reading sensor here)
    echo "bar is $bar"
}

foo & #this is to run the foo function as a background process.

temperature=$(command for measuring temperature here)
humidity=$(command for measuring humidity here)

wait %1 #this should pause the script until the function foo is complete.
echo "function foo has finished. bar is $bar"

curl -X GET -G (URL to server) -d bar=$bar -d temperature=$temperature -d humidity=$humidity

Когда я запускаю скрипт, вывод будет следующим:

bar is 1234

функция foo завершена. bar это

Обратите внимание, что это должно сказать "функция foo закончила. bar 1234".

... если я добавлю в set -x at При запуске скрипта команда curl (в конце скрипта) выглядит примерно так:

curl -X GET -G (URL-адрес сервера) -d bar = -d температура = 21,5-дневная влажность = 65

Опять же, обратите внимание, что переменная bar пуста.

Если у меня тот же скрипт без ожидания Команда (и запуск функции без амперсанда после нее), функция правильно устанавливает переменную bar , и полученная команда curl завершена. Однако, когда я использую команду ожидания, как описано выше, переменные из функции foo теряются после ее завершения.

Есть ли какой-то способ сохранить эти переменные, которые установлены функция foo ?

1 Ответ

0 голосов
/ 07 января 2020

Просто суммируем комментарий Бармара, чтобы он мог быть помечен как ответ ...

Проблема в том, что функция, работающая в фоновом режиме, запускается в вспомогательной оболочке, а не в той же оболочке, что и запускается основной сценарий, а переменные, заданные в вложенной оболочке, никогда не передаются в основную оболочку (в которой выполняется сам сценарий).

Возможное решение - записать переменные в file и - после команды wait - снова считайте переменные из этих файлов.

...