`cmd1&& cmd2&& cmd3`チェーンをエレガントに一時停止して再開するには?

`cmd1&& cmd2&& cmd3`チェーンをエレガントに一時停止して再開するには?

~から前の質問&&正しく対話する方法を理解できないようです^Z

$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4
Running command3
Running command4

、チェーンが始まった後に「追加」するために使用できると思うのはcommand3最後のコマンドであり、停止するのでうまくいくようです。command2たとえば、誰が別の結果を提供します(誰がcommand3無視する必要があるか)。

&&残りのコマンドをキャンセルせずにチェーンを正常に中断する方法は?また、コマンドラインに追加のロジックが必要な場合は、終了コードを保存したいと思います。

チェーンを早く一時停止したい場合があることがわかった場合は、次のように始めることができるので、( command1 && command2 && command3 )正常に一時停止する必要があります。しかし、すぐに始めたらどうすればいいですか?

コマンドが出力を提供せず(上記の例とは異なり)、2回実行しないでください。順序が間違っている場合は、私が考えることができる唯一の方法は、を押して何が停止したかを^Z分析して手動でビルドすることです。fd && the_rest_of_commandsこれは不便で間違いが簡単です。

ベストアンサー1

何が起こったのか誤解していると思います。これを行うとき:

cmd1 && cmd2

シェルはcmd1子プロセスから開始してそのプロセスを待ち、終了ステータスがcmd2ゼロの状態で終了すると起動します。cmd1

を押すとCtrl+Z待機が返され、シェルは$?148(たとえば(128 + SIGTSTP))に設定され、残りの評価は完了します。その瞬間、やはりcmd2そうです。いいえ処刑される。そしてcmd1バックグラウンド作業になります。

次のように入力する場合:

cmd1 || cmd2

または:

cmd1; cmd2

cmd2処刑される~上Ctrl-Zfgそして、次のプロンプト(またはbg可能であればバックグラウンドタスク)を受け取る前に完了するまで待つ必要があります。

でをzsh押すとCtrl-Z

{cmd1 && cmd2 && cmd3}

これにより、グループ全体が一時停止され、サブシェルに移動されます。しかし、再開時に保留中のコマンドは終了時の終了状態にかかわらず 20 に設定され、$?この問題を解決する方法がないと思うので結局同じ動作が発生します{cmd1 || cmd2}(cmd2 では) で直接実行されるのではなく cmd1 ) が完了した後に実行になりますCtrl-Z

おすすめ記事