现在的位置: 首页 > 综合 > 正文

[Shell]文件描述符示例

2014年01月14日 ⁄ 综合 ⁄ 共 965字 ⁄ 字号 评论关闭

  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
Tags: .
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!

抱歉!评论已关闭.