如何将后台作业的输出分配给bash变量?

4
我想在bash中运行后台任务并将其结果赋值给一个变量。我不想使用临时文件,并且希望同时运行多个类似的后台任务。
root@root:/# var=$(echo "hello world")
root@root:/# echo $var
hello world
root@root:/# back_var=$(sleep 2s && echo "hello world back") &
[1] 2102
root@root:/# wait
root@root:/#jobs
[1]+  Done                    back_var=$(sleep 2s && echo "hello world back")
root@root:/# echo $back_var

root@root:/# 

我宁愿不使用gnu-parallel或临时文件。

更明确地说,在我看来,这不是一个简单的问题:

root@root:/# back_var_1=$(sleep 4s && echo "Don't waste my time" &) &
[1] 26584
root@root:/# wait
[1]+  Done                    back_var_1=$(sleep 4s && echo "Don't waste my time" &)
root@root:/# echo $back_var_1

root@root:/#

我不明白为什么你要捕获 sleep。为什么不直接写成 sleep 2 && var=$(echo "hello world") & - fedorqui
@fedorqui,这只是一个玩具模式示例,以展示我想要实现的内容。考虑一个括号中是异步操作(IO)的情况,其具有长时间执行命令。 - 0x90
1
好的,我明白了。可能值得一读Bash:捕获在后台运行的命令的输出。我还没有彻底阅读它,但可能包含有用的信息。 - fedorqui
@fedorqui,你提到的那个帖子似乎不是我正在寻找的。 - 0x90
1
@0x90:我发现了我的错误。你考虑过使用命名管道吗? - blackSmith
1
嗯,不要成为“root”,特别是如果你不确定自己在做什么。 - tripleee
1个回答

3

使用命名管道是可能的。但是,我不知道它是否会被视为临时文件:

 $ mkfifo pipo
 $ sleep 4s && echo "this is not fair" > pipo & 
 [1] 25356

 $ back_var=$(cat pipo)
 [1]+  Done                    sleep 4s && echo "this is not fair" > pipo

 $ echo $back_var
 this is not fair

希望这有所帮助。

这是一个不错的想法。FIFO 也会阻塞,因此可以将其用作同步机制。 - 0x90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接