linux下exec学习心得

每个打开的文件都会被分配一个文件描述符. 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———