Linux系统中,每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件。大家知道,标C中,每个进程默认打开的有三个文件,标准输入、标准输出、标准错误输出,分别用一个FILE结构的指针来标示,即stdin、stdout、stderr,这三个结构中分别维护着三个文件描述符0、1、2。
打开文件描述符
Shell中,0、1、2也是默认可用的三个文件描述符。为了利用其他文件描述符来标识特定文件,我们需要使用exec命令打开该文件,并指定一个数字作为描述符:
exec m> outfile exec n< infile |
第一行打开文件outfile,并赋予文件描述符m,第二行打开文件infile,并赋予文件描述符n。
复制文件描述符
符号<&可以复制一个输入文件描述符,符号>&可以复制一个输出描述符。例如下面命令打开文件描述符n,并将其作为文件描述符m的副本:
exec n<&m |
关闭文件描述符
exec n<&- exec m<&- |
一个演示脚本
下面的这个脚本修改自《A Practical Guide to Linux Command, Editions, and Shell Programming》。不提供参数时,它将标准输入输出到标准输出;提供一个文件名参数时,将该文件输出到标准输出;提供两个文件名参数时,它将提一个文件复制到第二个文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #! /bin/sh case $# in 0) exec 3<&0 4>&1 ;; 1) exec 3<$1 4>&1 ;; 2) exec 3<$1 4>$2 ;; *) echo "Usage: `basename $0` [source [dest]]" exit 1 ;; esac cat <&3 >&4 exec 3<&- 4<&- exit 0 |
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!