Ctrl + D结束终端线输入


21

如果我做

$ cat > file.txt

文本Ctrl- DCtrl-D

问题1:如果我不按回车,为什么我必须按Ctrl- D两次?

如果我做

$ 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

为什么第二次使用1行文件?


2
stackexchange网站下的该线程为您提供了答案:stackoverflow.com/questions/7369170/…。希望能帮助到你。

是的,即使与python没有关系,我的问题也是重复的。

当您输入ctrl-z时,您是否真的只是得到一个新的Shell提示符,或者是否还收到了有关cat停止的消息?
Mark Plotnick

我将更新问题
薄雾

Answers:


30

在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


1
这些仅适用于规范模式终端。即使在这种情况下,也可以更改它们。
mikeserv

@mikeserv是的。在这里,我只想解释OP所看到的。我考虑过还要描述原始的/ -icanon终端模式,其他特殊字符,如何自定义它们,它们在操作系统中有何不同等,但不想让答案过长。
Mark Plotnick

以上是否表示如果未通过输入cat,则从键盘读取数据并且第一次未停止的程序read继续产生零,并且所需的Control-D数量将由以下方式确定:程序确定已完成的连续零个数?
2015年

@supercat如果需要,程序可以继续读取。在ex编辑器中,如果键入Control-D作为一行的第一个字符,则编辑器将显示程序的几行,而不是退出。(在ex和中vi,Control-D是“向下”的助记符)。在许多Shell中,如果您键入Control-D但在后台运行作业,则Shell会通知您而不是退出,但是如果您再次键入Control-D,则Shell决定您还是要退出。将这样做。
Mark Plotnick

@MarkPlotnick:是否可以通过管道发送这些零字节的打s?
超级猫

19

这是因为Ctrl+ D是骇客。

在最深处,Ctrl+ D(尽管被称为eof字符)实际上并不意味着文件结尾:它的意思是“立即将待处理的输入发送到应用程序”。实际上,这与Ctrl+ Meol)的含义很接近,后者发送待处理的输入和换行符。

当您在一个+之后(即一行的开头)或另一个+ 之后立即按Ctrl+时,挂起的输入为空。因此,应用程序接收0字节的输入。在通话中,读取0字节表示文件结束。DCtrlMCtrlDread


当您按Ctrl+时Z,挂起的输入将被丢弃。因此,仅处理在按+ 之前cat通过输入换行符或Ctrl+ 已发送到应用程序(即)的内容。DCtrlZ


1
可以发现关于CTRL + d从吉勒的回答之一的更多信息这里
拉梅什(Ramesh)

如您所说,Ctrl-D并不意味着文件结尾。实际上,这并不意味着不是因为Ctrl-D为EOT(文本结尾)。
H2ONaCl
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.