70

bash では、次のようにセミコロンで区切ってコマンドを次々に実行できることを知っています。

$ command1; command2

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

$ command1 && command2

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

ところで、何をするのに適切な用語は何Ctrl-zですか?

4

2 に答える 2

95

次のようにする必要があります。

(command1; command2)

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

于 2012-11-28T08:03:40.803 に答える
11

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

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

これを論理的な「OR」である || と比較してください。これは、コマンドのいずれかが機能するまで左から右にコマンドを実行します。

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

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

CTRL+Z の適切な用語はサスペンド文字です。これもmanページからのものです。

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

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

見てstty -aみると以下のようになります。

susp = ^Z; 

したがって、「通常」というフレーズを変更できます。しかし、そうしないでください。みんなを混乱させるでしょう。ターミナル ドライバは、Bash によってトラップされる SIGTSTP シグナルを生成します。

于 2012-11-28T08:45:30.657 に答える