将等待命令与BASH中的函数一起使用后,变量将不保留

问题描述 投票:0回答:1

我必须记录来自各种传感器的测量值,其中一些会花费一些时间。我想同时从传感器获取读数,以节省时间。

我有一个函数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是1234

foo功能已完成。酒吧是

请注意,此应该说“函数foo已完成。bar为1234”。

...如果我在脚本开始处添加set -x,则curl命令(在脚本末尾)看起来像这样:

curl -X GET -G(服务器的URL)-d bar = -d温度= 21.5-d湿度= 65

同样,请注意bar变量为空。

如果我有相同的脚本而没有wait命令(并且在运行函数时不带“&”号,则该函数将正确设置bar变量,并且生成的curl命令已完成。但是,当我如上所述使用wait命令时,一旦功能完成,foo函数中的变量就会丢失。

是否有某种方法可以保留由功能foo设置的这些变量?

bash function variables wait
1个回答
0
投票

仅在此处汇总Barmar的评论,以便将其标记为答案...

问题是,在后台运行的功能在子外壳中运行,而不是在运行主脚本的外壳中运行,并且在子外壳中设置的变量永远不会转移到主外壳中shell(脚本本身正在其中运行)。

一种可能的解决方案是将变量写入文件,并且-在等待命令之后-再次从那些文件中读取变量。

© www.soinside.com 2019 - 2024. All rights reserved.