デュアルアンパサンドリンク条件が最後のリンク条件とともにバックグラウンドで実行されるのはなぜですか?

デュアルアンパサンドリンク条件が最後のリンク条件とともにバックグラウンドで実行されるのはなぜですか?

バックグラウンドジョブを実行するには、いくつかの条件があります。

condition-command && condition-command && background-job &

問題は、次のようにジョブが実行されるまで条件をブロックしたいということです。

condition-command; condition-command; background-job &

ただし、これは条件ではなく、前のコマンドが失敗した場合にジョブを実行したくありません。

私はそれが非同期であることを知っていますが、そうではありません。次の2つのスクリプトは同じでなければなりませんが、そうではありません。

sleep 2; echo foo & sleep 1; echo bar; wait   # prints foo, then bar: correct
sleep 2 && echo foo & sleep 1; echo bar; wait # prints bar, then foo: bug

変数をテストするか、最後の変数をサブシェルに入れるとうまくいくことがわかりましたが$?(それからジョブ制御を失い、デーモンを避けたい)、bashがこれを行う理由と実行場所が何であるかを知りたいです。記録はありますか?この動作を防ぐ方法はありますか?

編集する:Chainedifは逆重なので代替として受け入れません。
編集2:サブシェルが可能であることを知っていますが、私には機能しません。結局、いくつかのコマンドを実行したいと想像してみましょうwait。ディレクトリが存在するかどうかを確認することは可能です/proc/$PIDが、複数の作業がある場合は面倒です。
編集3:主な質問は、bashがこれを行う理由とそれに関する文書はどこにありますか?どんな解決策でもないボーナスです!

ベストアンサー1

背景を行全体に適用したくない場合は、次のようにしますeval

sleep 2 && eval 'sleep 10 &'

wait2番目のコマンドだけがバックグラウンドジョブであり、実行できる正しいバックグラウンドジョブになります。

おすすめ記事