単一行のbashで複数のバックグラウンドコマンドを実行するにはどうすればよいですか?


169

私は通常、次のようなもので複数のコマンドを実行します。

sleep 2 && sleep 3

または

sleep 2 ; sleep 3

しかし、1つのコマンドラインコマンドからバックグラウンドで両方を実行したい場合はどうなりますか?

sleep 2 & && sleep 3 &

動作しません。そして、どちらも置き換えるん&&;

それを行う方法はありますか?


8
()コマンドを囲むために使用します。
nhahtdh 2013年

回答:


318

正確にどのように実行したいですか?それらをバックグラウンドで開始して順次実行たい場合は、次のようにします。

(sleep 2; sleep 3) &

一方、それらをバックグラウンドで並行して実行する場合は、代わりに次のように実行できます。

sleep 2 & sleep 3 &

また、次のような2つの手法を組み合わせることができます。

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

bashはbashであり、同じタスクを実行するためのさまざまなテクニックが数多く存在しますが、微妙な違いがある場合もあります。


20
これは簡潔でよく考え抜かれた答えであり、「人に釣りを教える」というものです。ありがとう。
アンブルス2014年

2
私たちがやるとsleep 2 && sleep 3 &どうなりますか?私はbashで試してみましたが、同じように動作するようです(エコーで試してみました)。
ワジャハット

@HakanBaba、はい、確かにバックグラウンドでサブシェルを作成します。
Douwe van der Leest

3
@ワジャハット、やってみましたsleep 2 && echo "foo" && sleep 3 & echo "bar""か?&&オペレータは、その前にコマンドを実行するシェルを伝え、そしてのみ誤りなくそのコマンドを実行する場合、シェルは、後続のコマンドを実行します。致命的なエラーでない限り、前のコマンドの終了ステータスに関係なく後続のコマンドを実行できる;ため、これはとは本質的に異なり;ます。&バックグラウンドで、それに先行する「接続」コマンドの全てを実行するためにシェルに指示。ここで「接続されている」とは、コマンドがパイプ(|)または論理演算子の一部であることを意味します。
Douwe van der Leest

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.bashマニュアル。
ジンボムホン

49

最後のバージョンでいくつかの括弧を追加する必要があります-

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

またはこれも機能します-

(sleep 2 &) ; (sleep 3 &)

注:リストをで使用すると&、その終了ステータスは常にゼロになります。したがって、上記の2つのケースは同じことを行います(シェルは非同期的に両側を順番に実行します)。
ジンボムホン

9

複数のバックグラウンドコマンドを実行する&には、各コマンドの末尾を追加する必要があります。例: (command1 &) && (command2 &) && (command3 &)


5

上記の回答では括弧を使用しています。Bashも同様の目的で中括弧を使用できます。

{ sleep 2 && sleep 3; } &

中括弧は構文についてよりうるさいことに注意してください-の後{のスペース、前のスペース}、最後のセミコロンが必要です。状況によっては、中括弧は新しいサブシェルをforkしないため、より効率的です。この場合、それが違いを生むかどうかはわかりません。


1
どう{ sleep 2; sleep 3; } &ですか?
ケニーエビット2015年

4

これは機能します:

$(sleep 2 &) && sleep 3 &

また、あなたは行うことができます:

$(sleep 2 && sleep 3) &

0

私も同じ使命を持っています。私は試してみました(sleep2 ; fg )& sleep3 ; fg、それは働いています。また、ctrl + cを2倍にすると、2つのプロセスを停止できます。


0

次の$(command)ようにbashコマンドの置換を使用できます。

$(command1 ; command2) &

stdinとstdoutは引き続き親プロセスにリンクされており、少なくともstdoutのリダイレクトは注意が必要です。したがって、別の方法として、コマンドを1行でチェーンし、文字列をbashコマンドに渡して、実行を処理する新しいプロセスを生成することもできます。

bash -c "command1 ; command2" & 

これは、複数のコマンドをバックグラウンドで実行する必要があるbashスクリプトで特に役立ちます。

この2つのステートメントは同等でなければなりません。bashプロセスは、コマンド(コマンドの鎖)を処理するために、両方の場合にスポーンされ、&終了時に実行を切り離し。

今度は、追加することができます&>/dev/null前に&、少なくとも標準出力をリダイレクトし、親プロセスの標準出力に出力を避けるために、コマンドの最後に。何かのようなもの:

bash -c "command1 ; command2" &>/dev/null &

-1

複数のコマンドを順番に実行したい場合は、どこでも機能する非常にシンプルな方法があります。ファイルを作成することです。この方法の利点は、クリーンでシンプルなことです。

最初に、たとえばのような名前でファイルを作成しますcommands.sh。次に、コマンドをそこに置きます。これがサンプルです:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

さて、今は最後のステップです。コマンドをバックグラウンドで(順次)実行するには、次のコマンドを実行します。

$ sh commands.sh &
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.