我有 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 结束终端行输入回答 马克·普洛特尼克