標準入力の終了を通知する方法


82
  1. Bashでは、終了ドキュメントはここのドキュメントで変更できることを学びました。しかし、デフォルトでは標準入力の終了をどのように通知できますか?
  2. catとchardetを使用すると、Ctrl + dで標準入力が終了したことを示すことができます。しかし、Ctrl + dとCtrl + cは実行中のコマンドの実行を終了することに似ていることを覚えているようです。だから私は間違っていますか?

回答:


114

Ctrl+D、端末の行の先頭で入力すると、入力の終わりを示します。これはUNIXの意味での信号ではありません。アプリケーションが端末から読み取り中にユーザーがを押すCtrl+Dと、ファイルの終わりに到達したことがアプリケーションに通知されます(ファイルから読み取って、最後のバイト)。

Ctrl+CシグナルSIGINTを送信します。デフォルトでは、SIGINT(割り込みシグナル)はフォアグラウンドアプリケーションを強制終了しますが、アプリケーションはシグナルをキャッチして何らかの方法で反応することができます(たとえば、シェル自体がシグナルをキャッチし、入力を開始した行を中止しますが、終了すると、新しいプロンプトが表示され、新しいコマンドラインを待ちます。

sttyコマンドで ファイルの終わりとSIGINTに関連付けられた文字を変更できます。たとえば、ファイルの終わり文字stty eof aを作成astty intr ^-、SIGINT文字を無効にします。これはめったに役に立ちません。


ありがとう!Ctrl+DCtrlと大文字の Dを意味しますか、それは重要ではありませんか?
ティム

5
@Tim:それはあなたが望む小文字です...キーボードのラベルは常に大文字であり、記述されているものはプログラムが見る実際の文字コードではなくキー配列であるため、キーボードコマンドを大文字で書く慣習があります。はい、これは時々混乱します。
カレブ

@カレブ:ありがとう!キーが大文字であることをどのように指定しますか?または、そのようなケースはありますか?
ティム

@Tim端末では、キーの組み合わせはCtrl+Shift+DCtrl+Dとにかく同じ文字を送信します(通常、4と呼ばれる文字番号4 Ctrl+D)。
ジル

2
@Tim 端末はCtrl + Dを受け取りました。プログラムにキャラクターを送信しません。起こることは、プログラムが端末から読み取るとき、プログラムがディスクファイルの終わりの後に読み取りを試みるときと同じように、端末は「これはファイルの終わりです」と言うことです。シェルはまったく関与していません。
ジル

23

2番目のポイントは、2つのまったく異なるものをまとめます。

後者を探しています。


7
ここで混乱する可能性:アプリケーションの観点から、^ Dに対して実際の文字は送信されません。これは、アプリケーションがread(2)syscall からその文字を受け取らないことを意味します。
ulidtko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.