Ctrl+D ターミナルライン入力終了

Ctrl+D ターミナルライン入力終了

もし私がするなら

$ cat > file.txt

テキスト - -CtrlDCtrlD

Q1:Enterキーを押さないと、なぜCtrl- をD2回押すのですか?

もし私がするなら

$ cat > file.txt

パバンプシュCtrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

パンです。

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

2番目のファイルにはなぜ1行しかありませんか?

答え1

Unixで読み書き可能なほとんどのオブジェクト(通常のファイル、パイプ、端末、RAWディスクドライブ)はファイルのように設計されています。

プログラムは、cat次のように標準入力を読み込みます。

n = read(0, buffer, 512);

512バイトが必要です。n実際に読み込んだバイト数、またはエラーが発生した場合は-1です。

通常のファイルに対してこの操作を繰り返すと、512バイトの読み取りが大量に発生し、ファイルの末尾で少し短い読み取りが行われ、ファイルの終わりを過ぎて読み取ろうとするとゼロになります。したがって、<= 0になるcatまで実行されます。n

端末で読むのは少し異なります。行を入力すると、Enterキー押下が終了し、readその行のみが返されます。

一部の特殊文字を入力できます。一つはCtrl-D。このコマンドを入力すると、オペレーティングシステムは、ユーザーがCtrl-D入力したすべての現在の行(それ自体ではない)を読み取りを実行するプログラムに送信します。これは日常的なことです。それがCtrl-D行の最初の文字であれば、プログラムは長さゼロの行に送られます - プログラムがそれが通常のファイルの終わりに達したことを確認するのと同じです。cat 別のことをする必要はありません、通常のファイルから読み込んだり、端末から読んだりしても構いません。

別の特殊文字はですCtrl-Z。 1行の任意の場所に入力すると、オペレーティングシステムは以前に入力した内容をすべて破棄し、プログラムにSIGTSTP信号を送信します。これにより、プログラムは通常プログラムを停止(一時停止)し、制御をシェルに返します。

だからあなたの例では

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

破棄されたいくつかの文字を入力し、cat出力ファイルに何も書き込むことなく停止します。

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

行を入力すると、その行は出力catファイルを読み書きして停止Ctrl-Zしますcat

答え2

Ctrl+Dがハッキングだからです。

Deep down, Ctrl+ D(呼び出されてもeof特徴)は実際にはファイルの終わりを意味しません。これは、「保留中の入力をアプリケーションにただちに送信する」ことを意味します。これは、実際に待機している入力と改行文字を送信するCtrl+ M()の意味に近いです。eol

+の直後(つまり行の先頭)または別の+を押すと、保留中のCtrl入力は空になります。したがって、アプリケーションはゼロバイトの入力を受け取ります。中DCtrlMCtrlDread呼び出し時にゼロバイトを読み取ると、ファイルの終わりを示します。


Ctrl+を押すと保留Z中の入力が削除されます。したがって、+を押すか、+がアプリケーションに送信されるcat前に入力された改行文字のみが処理されます。CtrlDCtrlZ

関連情報