在*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