I normally run multiple commands with something like this:
sleep 2 && sleep 3
or
sleep 2 ; sleep 3
<
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.
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 &
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.
You need to add some parens in your last version --
(sleep 2 &) && (sleep 3 &)
or this also works --
(sleep 2 &) ; (sleep 3 &)
This works:
$(sleep 2 &) && sleep 3 &
Also you can do:
$(sleep 2 && sleep 3) &
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.