5

I would like to run a background job in bash and assign its result to a variable.

I prefer not to use temporary files and I would love to run multiple similar background tasks at the same time.

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:/# 

I prefer not to use gnu-parallel or temp files.

To be even clearer that's not a trivial question IMHO:

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:/#
6
  • I don't understand why you are catching sleep. Why don't you just say sleep 2 && var=$(echo "hello world") &? Commented Jun 16, 2016 at 9:05
  • @fedorqui, it's just a toy mode example in order to demonstrate what I want to achieve. Consider a case where the in parenthesis is an async operation (IO) with long execution time command. Commented Jun 16, 2016 at 9:09
  • 1
    OK, I see. Probably worth reading Bash: Capture output of command run in background. I haven't gone through it thoroughly, but may contain juicy info. Commented Jun 16, 2016 at 9:11
  • 1
    @0x90 : I've got my mistake. Have you considered using named pipes ? Commented Jun 16, 2016 at 14:01
  • 1
    Uh, don't be root, especially if you don't know exactly what you are doing. Commented Jun 21, 2016 at 5:12

1 Answer 1

3

With named pipes it's possible. However, I don't know whether it'll be considered as a temp file :

 $ 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

Hope it helps.

Sign up to request clarification or add additional context in comments.

1 Comment

It's a nice idea. Fifos are blocking too, so one can use it as a sync mechanism as well.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.