コマンドスキームをバックグラウンドに配置するには?

コマンドスキームをバックグラウンドに配置するには?

コマンドチェーンを背景に設定したいです(例:cp a b && mv b c && rm a

こうしてみましcp a b && mv b c && rm a &たが、最終過程のための背景に過ぎません。

コマンドチェーンの背景を設定する方法は?

答え1

cp a b && mv b c && rm a &そうだね実際には、newline以外の他のものより&優先順位が低いです。 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; } &

答え2

(cp a b && mv b c && rm a )&たとえば、チェーン全体を含めるには、括弧内に入れることができます。

関連情報