第一个 EOF 不起作用?

第一个 EOF 不起作用?

我有 Ubuntu 16.04 LTS,当我在终端中运行某些东西时,md5sum它会等待我的输入,然后我输入类似的内容Hello,但是当我按下CTRL+时D它不会终止,我必须第二次按CTRL+才能终止它!为什么?D

答案1

在 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 信号,该信号通常会停止(暂停)程序并将控制权返回给 shell。

所以在你的例子中

$ 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

来源: Ctrl+D 结束终端行输入回答 马克·普洛特尼克

相关内容