首先我们需了解‘文件描述符’的概念,内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

  文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文

如何创建文件描述符
进程获取文件描述符最常见的方法是通过本机 子例程 open或create获取或者通过从 父进程 继承。后一种方法允许子进程同样能够访问由 父进程 使用的文件。文件描述符对于每个进程一般是唯一的。当用fork 子例程 创建某个子进程时,该子进程会获得其父进程所有文件描述符的副本,这些文件描述符在执行fork时打开。在由fcntl、dup和 dup2 子例程复制或拷贝某个进程时,会发生同样的复制过程。
对于每个进程, 操作系统 内核 在u_block结构中维护文件描述符表,所有的文件描述符都在该表中建立索引。

################################################################################################################################################################################## spacer.gif

echo 123546 > 2.txt ******》123546重定向到一个2.txt的文件

exec 4<> 2.txt ******》以读写的方式绑定到文件描述符“4”中(可以理解“4”为一个设置的变量)
read -n 4 <&4 ******》从&4中读取4个字符(& 是在重定向里用来表示文件描述符,&0 表示标准输入。如果不用 & 那就会被认为是以 0 为名字的文件了,所以这其实也是一个语法的规定而已。)
echo -n . >&4 ******》向&4中以横向增加一个点“.”(因为之前设置了'read -n 4',所以这个点将加在第四位后面,即1235.6;如果是“..”,那么就是1235..)
exec 4>&- ******》关闭输出文件描述符4
##############################################################################################################################################举例如下:
[root@david /tmp 02:27 &50]#echo 123456 >2.txt
[root@david /tmp 02:28 &51]#cat 2.txt
123456
[root@david /tmp 02:28 &52]#exec 8<>2.txt
[root@david /tmp 02:28 &53]#cat 2.txt
123456
[root@david /tmp 02:28 &54]#read -n 4 <&8
[root@david /tmp 02:29 &55]#cat 2.txt
123456
[root@david /tmp 02:29 &56]#echo -n .. >&8
[root@david /tmp 02:30 &57]#cat 2.txt
1234..
[root@david /tmp 02:30 &58]#exec 8>&-
[root@david /tmp 02:31 &59]#cat 2.txt
1234..
##############################################################################################################################################