web-dev-qa-db-ja.com

端末行入力を終了するにはCtrl + D

私が行った場合

$ cat > file.txt

テキストCtrl-DCtrl-D

質問1:Enterキーを押さない場合、なぜ押さなければならないのですか? Ctrl-D 二回?

私が行った場合

$ cat > file.txt

pa bam pshhhCtrl-Z

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

pa bam pshhh

Ctrl-Z

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

2回目に1行のファイルがあるのはなぜですか?

21
mist

Unixでは、通常のファイル、パイプ、ターミナル、ローディスクドライブなど、読み書きできるほとんどのオブジェクトは、すべてファイルに似せて作られています。

catのようなプログラムは、次のように標準入力から読み取ります。

n = read(0, buffer, 512);

512バイトを要求します。 nは実際に読み取られたバイト数です。エラーが発生した場合は-1です。

これを通常のファイルで繰り返し行った場合、512バイトの読み取りが大量に行われ、ファイルの最後でやや短い読み取りが行われ、ファイルの最後を超えて読み取ろうとすると0になります。したがって、catは、nが0以下になるまで実行されます。

端末からの読み取りは少し異なります。行を入力した後、 Enter キー、readはその行だけを返します。

入力できる特殊文字がいくつかあります。一つは Ctrl-D。これを入力すると、オペレーティングシステムは、入力した現在の行をすべて送信します(ただし、 Ctrl-D 自体)読み取りを行うプログラムに。そして、ここが偶然のことです:もし Ctrl-D 行の最初の文字である場合、プログラムには長さ0の行が送信されます-プログラムが通常のファイルの終わりに到達したかどうかを確認するのと同じように。 cat通常とは異なる方法で何もする必要はありません、通常のファイルから読み込んでいるか、端末から読み込んでいるかに関係なく。

別の特殊文字は Ctrl-Z。入力すると、行の任意の場所で、オペレーティングシステムはその時点までに入力したものをすべて破棄し、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が1行で入力し、それを読み取って出力ファイルに書き込んだ後、 Ctrl-Zcatを停止しました。

30
Mark Plotnick

それは Ctrl+D ハックです。

深く、 Ctrl+Deof文字 と呼ばれているにもかかわらず)実際にはファイルの終わりを意味するのではなく、「アプリケーションに保留中の入力を今すぐ送信する」という意味です。これは実際には Ctrl+Meol)、保留中の入力と改行を送信します。

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


押すと Ctrl+Z、保留中の入力は破棄されます。したがって、改行を入力するか、アプリケーションにすでに送信されたもの(cat)のみ、または Ctrl+D 押す前 Ctrl+Z 処理されます。