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


36

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

以下のコマンドを試しましたが、機能しません。

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

単一の「コマンド」とは何ですか?バッシュの行?
オルフロレンツェン


明らかな何かを見逃しているかもしれませんが、&&は前のコマンドの終了コードを知っていることを意味します。バックグラウンドにすると、終了コードはわかりません。そこで必要な機能は何ですか?
-Richlv

回答:


32

シェル構文の観点からは、/ / ... &などのコマンドを分離します(もちろん、意味は異なります)。だからそれだけです:;|&&

cmd1 & cmd2 & cmd3 &

1
これは/ quite / rightではなく;、最初のコマンドが終了するとすぐに次のコマンドを開始します。&実際にコマンドをバックグラウンドに配置します。ちょうどこの試してください:echo foo & echo bar & echo test &
Oluf Lorenzenの

1
@Finkregh、もちろん。それを疑う人はいません。両方のコマンドを(構文の観点から)別々に実行することを意味しているだけでした。
ステファンシャゼル

質問は「単一コマンド」の発行を指定しているため、尋ねられたものとはまったく異なります。それはあまりにも一連のコマンドであるが、それはその出力に単一のコマンドの意味少なくとも一方が連結されている、などをリダイレクトすることができますように、私の答えではありませんどちらも
イーライ酔わ

「1つのコマンドで複数のコマンドを実行する」というのは矛盾しているようですが、それはどういう意味ですか?これが何かのためのものである場合sudo、パスワードを1回だけ入力するbash -cか、ラップしてから入力するか、同様のことができます。
-Richlv

12

複合コマンド」というタイトルのbashのマンページセクションには、リストコマンドとグループコマンドの2つのオプションがあります。

グループコマンドは、中括弧で囲まれた一連のコマンドです。 {}です。リストは同じで、括弧で囲まれています()。両方を使用して、内部の複数のコマンドをバックグラウンド化し、最終的にコレクション全体をセットとしてバックグラウンド化できます。リスト構造はサブシェルでコマンドを実行するため、変数の割り当ては保持されません。

コマンドのグループを実行するには:

{ command1 & command2 & } &

リスト(サブシェル)でコマンドを実行することもできます。

( command1 & command2 ) &

1
どういたしまして。マニュアルにリンクを追加しました。リスト()構文はサブシェルで囲まれたコマンドを実行するため、変数は内部に保持されないことに注意してください。
エリヘディー

3

別の方法:

$(command1 &) && command2 & 

いいえ、それはまず、それが別のコマンドを実行します終了後、最初のコマンドを実行します
ラーフルパティル

&&あなたの質問で使用した場合、最初にコマンドを実行し、次に正常に実行されたら次のコマンドを実行することを意味します。それを考慮しない場合は、実行できますcommand1 & ; command2 & ;
-PersianGulf

最初のコマンドが正常にBGに行く、または使用しないで実行;それと全く問題
ラーフルパティル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.