创建读写文件描述符

创建读写文件描述符

Content #

可以打开单个文件描述符兼做输入和输出,这样就能用同一个文件描述符对文件进行读和写两种操作了。

但使用这种方法时要特别小心。由于这是对一个文件进行读和写两种操作,因此 shell会维护一个内部指针,指明该文件的当前位置。任何读或写都会从文件指针上次的位置开始。如果粗心的话,这会产生一些令人瞠目的结果。来看下面这个例子:

$ cat test16
#!/bin/bash
# testing input/output file descriptor

exec 3<> testfile
read line <&3
echo "Read: $line"
echo "This is a test line" >&3
$ cat testfile
This is the first line.
This is the second line.
This is the third line.
$ ./test16
Read: This is the first line.
$ cat testfile
This is the first line.
This is a test line
ine.
This is the third line.
$

在这个例子中,exec命令将文件描述符3用于文件testfile的读和写。接下来,使用分配好的文件描述符,通过read命令读取文件中的第一行,然后将其显示在 STDOUT中。最后,使用echo语句将一行数据写入由同一个文件描述符打开的文件中。

在运行脚本时,一开始还算正常。输出内容表明脚本读取了testfile文件的第一行。但如果在脚本运行完毕后查看testfile文件内容,则会发现写入文件中的数据覆盖了已有数据。

当脚本向文件中写入数据时,会从文件指针指向的位置开始。read命令读取了第一行数据,这使得文件指针指向了第二行数据的第一个字符。当echo语句将数据输出到文件时,会将数据写入文件指针的当前位置,覆盖该位置上的已有数据。

From #

Linux命令行与shell脚本编程大全