コマンドチェーンをバックグラウンドにする方法は?


15

のようなコマンドチェーンの背景を作りたいですcp a b && mv b c && rm a

私はやってみましたcp a b && mv b c && rm a &が、これは最後のプロセスの背景にすぎません。

コマンドチェーンをバックグラウンドにするにはどうすればよいですか?

回答:


22

cp a b && mv b c && rm a &正しい。&優先順位はの優先順位よりも低くなってい&&ます。実際、newline:は&以外の優先順位よりも低い優先順位を;持ちます:&は、と同じ構文カテゴリにあります。;違い;は、コマンドリストをフォアグラウンドで実行し、コマンドリストを&バックグラウンドで実行することです。これを自分でテストできます。

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited

pdksh、ksh93、bash、csh、tcshと同じです。

例外はzshで、これは奇妙に互換性がありません。これはマニュアルに記載されています

サブリストが、、またはで終了している&場合&|&!シェルはバックグラウンドで最後のパイプラインを実行し、終了するのを待ちません(サブリスト全体をバックグラウンドで実行する他のシェルとの違いに注意してください)。

残念ながら、zshはshまたはksh互換モードでもこのように動作します。コマンド全体がバックグラウンドで実行されるようにするには、中括弧または括弧を囲みます。括弧はサブシェルを作成しますが、ブレースは作成しませんが、バックグラウンドコマンドはサブシェルにあるため、これは無関係です(一部のシェルのマイクロ最適化を除く)。

{ cp a b && mv b c && rm a; } &

8
のbash{ ... ; } &一方で、現在のプロセスレベルでフォークを行う( ... ) &サブシェルからフォークを行う...結果は同じですが、微妙な違いがとにかくあります。
F.ハウリ

14

(cp a b && mv b c && rm a )&チェーン全体を含めるように、パラセシスに入れることができます。


2
そして重要なことは、これにより、演算子全体のルールを知らない人でも、チェーン全体がバックグラウンドであることが明らかになることです
-jackweirdy

2
@Gillesの答えに対する私のコメントを見てください、私{ ... ; }は好ましい形(方法)だと思います。
F.ハウリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.