奇妙なcontrol-dの動作


9

することcatで、とてもシンプルなテキストエディタとして使用できますcat > foo.txt
次に入力すると:

bar
baz

ctrl+ を押すと、D次のようになります。

$ cat > foo.txt
bar
baz^D

カーソルを^。次にもう一度押すと、ファイルが保存されます。ただし、他の何か(おそらく何でもないが、ほとんど何でも)を押した場合は、ファイルの編集を続行します。

これは正常な動作ですか?

回答:


13

はい。それは^D本当にそうしなければなりません:現在のread(2)呼び出しを停止するだけです。

プログラムがint rdbytes = read(fd, buffer, sizeof buffer);実行し、^Dその間を押すread()と、バッファーに現在読み込まれているバイトで戻り、その数を返します。回線終端でも同じことが起こります。\n最後には常に配信されます。

その^Dため、行の先頭または次の後にあるだけ^Dが、EOFを通知するread()returnの望ましい効果を持っています0


これは、をどのように定義するかに依存します(末尾の\n..の有無にかかわらず、^D連続して2回押すだけで、最終的な改行文字を生成せずにEOF状態を引き起こすことが可能です(Enterキーを押す前にEnterキーを押すの^Dと同じ))。
Peter.O

あなたが正しい、私がそれを言及するのを忘れていた:行の始まりと「ちょうど押された^ D」は、バッファが空である2つの状況なので、^ Dはread()return を持ち0、EOFを示します。
glglgl

11

はい、これは正常な動作です。通常、単一のControl-Dは、それが行頭である場合にのみ発生します。これは1つのControl-Dで終了します。

$ cat > foo.txt
bar
baz
^D

行末でControl-Dを2回実行しても、後続の改行文字なしで抜け出します...
Peter.O

はい、あなたが正しい。そうでないことを意味するつもりはありませんでした。私は明確にするために私の答えを編集しました。
Klox、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.