从 bashrc 运行一个函数,但修改导出的变量

从 bashrc 运行一个函数,但修改导出的变量

我正在尝试从我的 bashrc 运行一个函数,该函数每分钟刷新一次并外部化一个变量。它看起来像这样:

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

其中“test”是变量,但当我获取此变量时,我无法从函数内部访问 CFN,我怀疑这是因为它在子 shell 中运行。有没有办法更改导出的 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 是大多数 unix 系统上的大型 IPC 总线,以及 TCP/ 或 UDP/IP(带netcatnc),但我没有看到太多使用这些的 shell 脚本。

您的最后选择是让所有这些保持原样并让您的脚本正常工作而不将其作为后台作业运行,以便您可以在运行时调整环境。

相关内容