exec与文件描述符

来源:互联网 发布:wps软件官方下载mac 编辑:程序博客网 时间:2024/04/28 01:04
在*nux系统中,一般在操作文件时会直接使用文件名,在支持POSIX的各种环境中,提供了一系列用于操作文件的工具,短小精悍却又强大得变态。在shell环境下,还经常文件描述符(正整数)来操作文件。
系统默认打开的描述符有3个:
    0   - 标准输入
    1   - 标准输出
    2   - 标准出错
所以,只要够斯文(别整太大的数,它不仅难记,而且你不需要),几乎所有的正整数都可以绑定到某个文件。

1、通过exec分配文件描述符
#!/bin/sh

exec 3<>hello.txt           # 以读写方式绑定到文件描述符"3"
echo "hello exec" >&3       # 写入"hello exec",如果之前有内容,这里将会从文件开头进行覆盖
echo "hello world" >&3      # 写入"hello world“,新的一行!
exec 3>&-                   # 关闭写,禁止写,然而,实际上它也不能读了~
                            # 如果是exec 3<&-,关闭读,同时它也不能写了~

在上面的示例中,将文件hello.txt绑定到了描述符3,如果要将输出重定向到hello.txt,只需要略作修改

2、将标准输出重定向到hello.txt
#!/bin/sh

exec 1>hello.txt        # 将输出重定向到文件hello.txt,从此以后,这个脚本中的输出都将被写入文件hello.txt
echo "hello exec"
echo "hello world"
就这么简单,在终端再也见不着输出了,因为你已经明确地告诉他,把这些信息写到文件去……

3、在上面这个示例中,输出被重定向了,如果要恢复怎么办?
#!/bin/sh

exec 100>&1             # 将文件描述符100连接到标准输出
                        # 由于之后还要输出到终端,所以我们不得不使用一个临时的描述符来保存它!
exec 1>hello.txt        # 将输出重定向到文件hello.txt,从此以后,这个脚本中的输出都将被写入文件hello.txt
echo "hello exec"
echo "hello world"
exec 1>&100 100>&-      # 将标准输出连接到100,这是之前保存的标准输出
                        # 将描述符100关了,一了百了,因为已经还原标准输出了,留着它实在没必要

echo "oh, my god!"      # 从这句开始将显示在终端上

4、标准输入的操作与2、3相似,只是使用的是"<"
#!/bin/sh

exec 100<&0
exec <hello.txt
read line1
echo $line1
read line2
echo $line2

exec 0<&100 100>&-

read custom

原创粉丝点击