入力の最後で押すC-d
と、入力がフラッシュされたように見えますがEOF
、プログラムに送信されません。ただしC-d
、もう一度押すEOF
と送信されます。
初めて押したときにEOFが送信されないのはなぜC-d
ですか?この動作はどこに文書化されていますか?
自分で遊んで実験するためにcat
、ここに例があります:
$ cat
abc<C-d>abc<C-d>
$
C-d
送信終了(EOT)文字です:
Unixでは、ファイルの終わり文字(デフォルトではEOT)により、ターミナルドライバは入力バッファ内のすべての文字をすぐに使用できるようになります。通常、ドライバーは行末文字が表示されるまで文字を収集します。入力バッファが空の場合(最後の行末またはファイルの終わり以降に文字が入力されていないため)、端末から読み取るプログラムはゼロバイトのカウントを読み取ります。Unixでは、このような状態はファイルの終わりに達したと理解されます。
あなたの例では、実行cat
して数文字の後にをC-d
入力すると、その時点までに入力された文字が送信さcat
れ、画面に印刷されます。これで入力バッファが空になり、C-d
もう一度入力するとcat
、バッファから0バイトが読み取られ、ファイルの終わりの条件が満たされたために終了します。
bashでは、おそらくreadlineライブラリを使用しています。
あなたがドキュメントを求めたように、ここにあります
Ctrl-Dでカーソルの下の文字が削除されることがわかります。読み続けると、すばらしいショートカットがたくさん見つかります。