回答:
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; } &
(cp a b && mv b c && rm a )&
チェーン全体を含めるように、パラセシスに入れることができます。
{ ... ; }
は好ましい形(方法)だと思います。
{ ... ; } &
一方で、現在のプロセスレベルでフォークを行う( ... ) &
サブシェルからフォークを行う...結果は同じですが、微妙な違いがとにかくあります。