私はbashでセミコロンで区切って次のコマンドを実行できることを知っています
$ command1; command2
または、command2
が成功した場合にのみcommand1
を実行したい場合は、&&
を使用します。
$ command1 && command2
これは機能しますが、command1
を使用してCtrl-z
を一時停止すると、最初の場合はcommand2
がすぐに実行され、2番目の場合はまったく実行されません。コマンドを順番に実行しながら、最初のコマンドを一時停止することはできますが、(fg
で)再起動して終了するまで2回目の実行はできませんか?私はこれをインタラクティブに行いたいので、できるだけ簡単に入力できるものが好きです。または、オプションをどこかに設定する必要があるだけかもしれません。
ところで、Ctrl-z
が行うことの正しい用語は何ですか?
次のようにしてください。
(command1; command2)
追加された括弧に注意してください。
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シグナルを生成します。