~から前の質問&&
正しく対話する方法を理解できないようです^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。