每个打开的文件都会被分配一个文件描述符. stdin, stdout, 和stderr的文件描述符分别是0, 1,
和 2. 除了这3个文件, 对于其他那些需要打开的文件, 保留了文件描述符3到9. 在某些情况下, 将这
些额外的文件描述符分配给stdin, stdout, 或stderr作为临时的副本链接是非常有用的. 在经过
复杂的重定向和刷新之后需要把它们恢复成正常状态。
1. exec1.sh
#!/bin/bash
exec 6>&0 #将文件描述符#6与stdin链接起来.保存stdin。
exec < data #stin被文件data代替(意思是从文件data中获取输入)
read line1 #读取data中第一行
read line2 #读取data中第二行
#以下为输出内容#?tdout)
echo “——–begin——–”
echo $line1
echo $line2
echo “——–end———-“
exec 0>&6 6>&-
#现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了,
#然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
#>&6 6>&- 这么做也可以
[root@localhost test]# sh exec1.sh
——–begin——–
123
234
——–end———-
2. exec2.sh
#!/bin/bash
exec 6>&1 #将文件描述符#6与stdout链接起来.保存stdout。
exec >tt.log #输出到tt.log中(stdout为tt.log)
#以下为tt.log中的内容
echo “——begin——-“
echo “hello world”
date +%Y%m%d
echo “——end———“
exec 1>&6 6>&-
#现在将stdout从fd #6中恢复, 因为刚才我们把stdout重定向到#6了,
#然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
echo “test”
[root@localhost test]# sh exec2.sh
test
[root@localhost test]# cat tt.log
——begin——-
hello world
20111006
——end———