コマンドのグループ化

コマンドのグループ化

&コマンドシーケンスの最後にアンパサンドを付けると、バックグラウンドで(「並列」で)実行され、セミコロン;を付けると連続して(「連続」で)実行され、括弧を付けるとコマンドのグループ化

bashいくつかのコマンドが書かれたファイルがあるとします:

#!/bin/bash
cmd1
cmd2
cmd3
cmd4

たとえば、最初の 2 つを並列で実行し、待機してから次の 2 つを並列で実行するなど、コマンドのグループ化を適用する場合は、次のように記述すればよいでしょうか。

#!/bin/bash
( \
cmd1 &
cmd2 &
); \
( \
cmd3 &
cmd4 & 
)

それともすべてを 1 行で必須にする必要がありますか?

#!/bin/bash
(cmd1 & cmd2 &);(cmd3 & cmd4 &)

または、どこでも継続行文字を使用しますか?

#!/bin/bash
( \
cmd1 & \
cmd2 &); \
( \
cmd3 & \
cmd4 & )

答え1

単に使用し&wait

cmd1 &
cmd2 &
wait
cmd3 &
cmd4 &
wait

wait はバックグループプロセスを待機します。

行の継続については、(と を使用します)。これは、リダイレクトがある場合にのみ役立つことに注意してください。

(
cmd1 &
cmd2 &
wait
) > some-log.A
(
cmd3 &
cmd4 &
wait
) > some-log.B

waitがない場合、サブシェルはすぐに戻ることに注意してください。

date ; (
> sleep 20 &
> sleep 10 &
> ) ; date
Wed Nov 29 16:08:15 CET 2017
Wed Nov 29 16:08:15 CET 2017

に比べ

date ; (
> sleep 20 &
> sleep 10 &
> wait
> ) ; date
Wed Nov 29 16:10:08 CET 2017
Wed Nov 29 16:10:28 CET 2017

関連情報