如果我想存储函数 f 的输出,我可以result=$(f)
但是如果 f 修改全局变量,这将不起作用,因为f是在子壳中执行。
这是一个说明问题的例子:
x=0
f()
{
x=1
echo "f"
}
result=$(f)
最后结果是“f”但是 x 是(仍然)0。有没有办法调用 f 以便它有副作用和将结果存储在变量中吗?
答案 0 :(得分:1)
您的选择:
1)在子shell中调用函数NOT并使用带有返回码的return
f()
{
x=1
return 15
}
x=0
f
r=$?
echo "$r $x"
将导致:
15 1
因此你们都改变了x
并且获得了一些返回代码(甚至不是字符串)
2)shell和子shell之间的IPC
Subshell是另一个进程,因此它无法访问父shell的变量。
但您可以构建一些自定义消息。 最简单 - 将“副作用”存储在一个完美的全局变量存储文件中。
f()
{
echo "1" > x.tmp
echo "f"
}
result=$(f) #"x" value is stored in x.tmp
3)将结果和副作用一起作为连续结果返回。
f()
{
x=1
echo "$x:f"
}
result_with_separator=$(f)