私は通常、次のようなもので複数のコマンドを実行します。
sleep 2 && sleep 3
または
sleep 2 ; sleep 3
しかし、1つのコマンドラインコマンドからバックグラウンドで両方を実行したい場合はどうなりますか?
sleep 2 & && sleep 3 &
動作しません。そして、どちらも置き換えるん&&
で;
それを行う方法はありますか?
私は通常、次のようなもので複数のコマンドを実行します。
sleep 2 && sleep 3
または
sleep 2 ; sleep 3
しかし、1つのコマンドラインコマンドからバックグラウンドで両方を実行したい場合はどうなりますか?
sleep 2 & && sleep 3 &
動作しません。そして、どちらも置き換えるん&&
で;
それを行う方法はありますか?
回答:
正確にどのように実行したいですか?それらをバックグラウンドで開始して順次実行したい場合は、次のようにします。
(sleep 2; sleep 3) &
一方、それらをバックグラウンドで並行して実行する場合は、代わりに次のように実行できます。
sleep 2 & sleep 3 &
また、次のような2つの手法を組み合わせることができます。
(sleep 2; echo first finished) & (sleep 3; echo second finished) &
bashはbashであり、同じタスクを実行するためのさまざまなテクニックが数多く存在しますが、微妙な違いがある場合もあります。
sleep 2 && sleep 3 &
どうなりますか?私はbashで試してみましたが、同じように動作するようです(エコーで試してみました)。
sleep 2 && echo "foo" && sleep 3 & echo "bar""
か?&&
オペレータは、その前にコマンドを実行するシェルを伝え、そしてのみ誤りなくそのコマンドを実行する場合、シェルは、後続のコマンドを実行します。致命的なエラーでない限り、前のコマンドの終了ステータスに関係なく後続のコマンドを実行できる;
ため、これはとは本質的に異なり;
ます。&
バックグラウンドで、それに先行する「接続」コマンドの全てを実行するためにシェルに指示。ここで「接続されている」とは、コマンドがパイプ(|
)または論理演算子の一部であることを意味します。
Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.
bashマニュアル。
上記の回答では括弧を使用しています。Bashも同様の目的で中括弧を使用できます。
{ sleep 2 && sleep 3; } &
中括弧は構文についてよりうるさいことに注意してください-の後{
のスペース、前のスペース}
、最後のセミコロンが必要です。状況によっては、中括弧は新しいサブシェルをforkしないため、より効率的です。この場合、それが違いを生むかどうかはわかりません。
{ sleep 2; sleep 3; } &
ですか?
次の$(command)
ようにbashコマンドの置換を使用できます。
$(command1 ; command2) &
stdinとstdoutは引き続き親プロセスにリンクされており、少なくともstdoutのリダイレクトは注意が必要です。したがって、別の方法として、コマンドを1行でチェーンし、文字列をbash
コマンドに渡して、実行を処理する新しいプロセスを生成することもできます。
bash -c "command1 ; command2" &
これは、複数のコマンドをバックグラウンドで実行する必要があるbashスクリプトで特に役立ちます。
この2つのステートメントは同等でなければなりません。bashプロセスは、コマンド(コマンドの鎖)を処理するために、両方の場合にスポーンされ、&
終了時に実行を切り離し。
今度は、追加することができます&>/dev/null
前に&
、少なくとも標準出力をリダイレクトし、親プロセスの標準出力に出力を避けるために、コマンドの最後に。何かのようなもの:
bash -c "command1 ; command2" &>/dev/null &
複数のコマンドを順番に実行したい場合は、どこでも機能する非常にシンプルな方法があります。ファイルを作成することです。この方法の利点は、クリーンでシンプルなことです。
最初に、たとえばのような名前でファイルを作成しますcommands.sh
。次に、コマンドをそこに置きます。これがサンプルです:
commands.sh:
#!/system/bin/sh
sleep 3;
sleep 2;
さて、今は最後のステップです。コマンドをバックグラウンドで(順次)実行するには、次のコマンドを実行します。
$ sh commands.sh &
()
コマンドを囲むために使用します。