在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
。