怪异的控制行为


9

我可以cat做为一个非常简单的文本编辑器cat > foo.txt
如果我输入:

bar
baz

然后按ctrl+ D,现在看起来像这样:

$ cat > foo.txt
bar
baz^D

光标放在^。如果再按一次,该文件将被保存。但是,如果我按其他任何键(可以,也许什么也不是,但大多数都可以),我将继续编辑文件。

这是正常行为吗?

Answers:


13

是。它与^D实际操作有关:它只是停止当前read(2)呼叫。

如果程序确实这样做,int rdbytes = read(fd, buffer, sizeof buffer);并且您在^D中间按一下,则read()返回缓冲区中当前读取的字节,并返回其编号。线路端接也是如此。将\n在年底总是交付。

因此,只有a ^D在行的开头或之后^D才具有read()return 的预期效果,从而表示0EOF。


这取决于您要定义的行的内容(带或不带尾随\n..,但可以^D连续两次按,并导致EOF条件,而不会生成最终的换行符(如在执行此^D操作之前按Enter键)。
Peter.O 2011年

您是对的,我忘了提到:行的开头和“刚按下^ D”是缓冲区为空的两种情况,因此^ D将具有read()return 0,表示EOF。
glglgl

11

是的,这是正常现象。通常,单个Control-D仅在该行的开头才出现。这用一个Control-D退出:

$ cat > foo.txt
bar
baz
^D

控制-d两次在一行的末尾没有打出来,没有一个换行符字符...
Peter.O

你是对的。我不是要暗示其他意思。我编辑了答案以弄清楚。
Klox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.