web-dev-qa-db-ja.com

UNIX / Mac OS X端末の^ Cと^ Dの違いは何ですか?

何かを停止しようとすると、ターミナルで^Cを使用し、場合によっては^Dを使用します。

2つの違いは何ですか?一部のプログラムが^Cではなく^Dに応答しない理由。 ^Dを使用するとTerminal.appが終了するのはなぜですか?

72
prosseek

CtrlCSIGINT を現在のフォアグラウンドプロセスに送信するように端末に指示します。これは、デフォルトではアプリケーションの終了に変換されます。 CtrlD 標準入力でEOFを登録する必要があることを端末に伝えます。これは、bashが終了したいという欲求として解釈します。

Ctrl+D^D)は ファイルの終わり を意味します。これは行の先頭でのみ機能します(少し簡略化しています)。プログラムが端末から入力を読み取っていない場合は効果がありません。実験では、^Dはシェルに、これ以上コマンドを入力する予定はないので終了したことを伝えました。その後、サブプログラムが終了したため、端末が終了しました。

Ctrl+C^C)は「中断」を意味します。つまり、実行中の処理を停止します。技術的には、^Cを押すと INT信号 が送信されます。これはデフォルトでアプリケーションを終了しますが、多くのプログラムではトップレベルに戻ることを意味します(たとえば、シェルではコマンドの入力をやめます)行して、元のプロンプトに戻ります)。

プログラムが^Cに応答しない場合は、 Ctrl+\^\)。これは QUITシグナル を送信します。これはデフォルトでアプリケーションを終了し、インターセプトするプログラムはそれほど多くありません。

シグナルを送信する別のキーは Ctrl+Z^Z)。 TSTPシグナル を送信し、フォアグラウンドで実行中のプログラムを一時停止します。 (TSTPは「ターミナルストップ」の略です。これは [〜#〜] stop [〜#〜] に似ていますが、STOPはできませんがTSTPは無視できます。シェルから、そのプログラムを再開できます。 fgコマンド(フォアグラウンドで再開)またはbgコマンド(バックグラウンドで再開)を使用した実行。

これらのキーはすべて stty コマンドで変更できます。一部のプログラム、特にキー割り当てのあるフルスクリーンプログラムは、それらを無効にします。

上記の2つの本当に良い答えに加えて、ここに例があります:

シェルでpythonと入力すると、Pythonの>>>プロンプトが表示されます。

ここで、_Ctrl+C_を押すと、KeyboardInterruptと表示され、>>>に留まります。
forループに入った場合、 for x in (text):と入力すると、...プロンプトを表示してさらに入力するのを待機します。ここで_Ctrl+C_を押すと、forステートメントを終了して>>>プロンプトに戻ります。
>>>または...のいずれの時点でも_Ctrl+D_を押すと、pythonプロンプトが終了し、元のシェルに戻ります。

同様に、別のマシンにsshした場合、_Ctrl+C_は既存のコマンドをすべて終了し、_Ctrl+D_はそれを実行してマシンも終了します。 (また、Deleteキーは_Ctrl+D_を実行するのと同じです)

3
Siddhartha