How do I run multiple background commands in bash in a single line?

前端 未结 8 1788
栀梦
栀梦 2020-11-28 19:11

I normally run multiple commands with something like this:

sleep 2 && sleep 3

or

sleep 2 ; sleep 3
<
相关标签:
8条回答
  • 2020-11-28 19:45

    The answers above use parentheses. Bash also can use braces for a similar purpose:

    { sleep 2 && sleep 3; } &
    

    Note that the braces are more picky about syntax--the space after {, the space before }, and the final semicolon are required. In some situations the braces are more efficient because they don't fork a new subshell. In this case I don't know if it makes a difference.

    0 讨论(0)
  • 2020-11-28 19:48

    You can use the bash command substitution $(command) like this:

    $(command1 ; command2) &
    

    Note that stdin and stdout are still linked to the parent process and redirecting at least the stdout can be tricky. So alternatively you can chain the commands in a single line then pass the string to the bash command to spawn a new process which will handle the execution.

    bash -c "command1 ; command2" & 
    

    This is especially useful in a bash script when you need to run multiple commands in background.

    This two statements should be equivalent. A bash process is spawn in both cases to handle the command (chain of commands) and the & at the end detaches the execution.

    This time you can add &>/dev/null before the & at the end of the command to redirect at least the stdout and avoid the output on the stdout of the parent process. Something like:

    bash -c "command1 ; command2" &>/dev/null &
    
    0 讨论(0)
  • 2020-11-28 19:53

    Exactly how do you want them to run? If you want them to be started in the background and run sequentially, you would do something like this:

    (sleep 2; sleep 3) &
    

    If, on the other hand, you would like them to run in parallel in the background, you can instead do this:

    sleep 2 & sleep 3 &
    

    And the two techniques could be combined, such as:

    (sleep 2; echo first finished) & (sleep 3; echo second finished) &
    

    Bash being bash, there's often a multitude of different techniques to accomplish the same task, although sometimes with subtle differences between them.

    0 讨论(0)
  • 2020-11-28 19:56

    You need to add some parens in your last version --

    (sleep 2 &) && (sleep 3 &)
    

    or this also works --

    (sleep 2 &) ; (sleep 3 &)
    
    0 讨论(0)
  • 2020-11-28 19:59

    This works:

    $(sleep 2 &) && sleep 3 &
    

    Also you can do:

    $(sleep 2 && sleep 3) &
    
    0 讨论(0)
  • 2020-11-28 19:59

    I have the same mission too. I have try (sleep2 ; fg )& sleep3 ; fg,it's working. And when you preass ctrl+c doubled,the two process can be stoppped.

    0 讨论(0)
提交回复
热议问题