web-dev-qa-db-ja.com

最初のコマンドを中断しても(Ctrl-z)、次から次へとコマンドを実行する

私はbashでセミコロンで区切って次のコマンドを実行できることを知っています

$ command1; command2

または、command2が成功した場合にのみcommand1を実行したい場合は、&&を使用します。

$ command1 && command2

これは機能しますが、command1を使用してCtrl-zを一時停止すると、最初の場合はcommand2がすぐに実行され、2番目の場合はまったく実行されません。コマンドを順番に実行しながら、最初のコマンドを一時停止することはできますが、(fgで)再起動して終了するまで2回目の実行はできませんか?私はこれをインタラクティブに行いたいので、できるだけ簡単に入力できるものが好きです。または、オプションをどこかに設定する必要があるだけかもしれません。

ところで、Ctrl-zが行うことの正しい用語は何ですか?

66
asmeurer

次のようにしてください。

(command1; command2)

追加された括弧に注意してください。

90
NPE

Bashでは、ジョブを(CTRL + Zまたは&を使用して)バックグラウンドに配置すると、ジョブの終了を待たずに、終了コード0(成功)を返します。あなたが観察したことは、manページに文書化されています。

論理的な「AND」の動作&&は、左から右にテストすることです。各部分は成功する必要があるため、最初の部分が失敗した場合、2番目の部分は実行されません。したがって、&&を使用すると、コマンドの1つが失敗するまで、左から右にコマンドが実行されます。成功の定義は、ゼロの終了コード($?)です。

これを論理的な「OR」、||と比較します。これは、コマンドの1つが左から右に実行されるworksです。

@NPEが提供するサブシェルソリューションの説明は、manページにも記載されています。

「a; b; c」の形式の複合コマンドおよびコマンドシーケンスは、プロセスの中断が試行されたときに適切に処理されません。プロセスが停止すると、シェルはシーケンス内の次のコマンドをすぐに実行します。配置するだけで十分です。サブシェルに強制するための括弧で囲まれた一連のコマンド。ユニットとして停止できます。

CTRL + Zの適切な用語はsuspend文字で、これもmanページからの抜粋です:

プロセスの実行中に一時停止文字(通常は^ Z、Control-Z)を入力すると、そのプロセスが停止し、制御がbashに戻ります。

manページを引用して申し訳ありませんが、本当にあなたの友人であり、読む価値があります)

stty -a次のようなものが表示されます。

susp = ^Z; 

したがって、それを変更できるため、「典型的に」というフレーズが使用されます。しかし、それをしないでください、それは皆の一体を混乱させるでしょう。ターミナルドライバは、BashによってトラップされるSIGTSTPシグナルを生成します。

11
cdarke