exec在shell中使用时执行不会返回当前的shell, 而是和之前的shell独立,就像是两个程序,但是不会产生新的pid。
exec命令如下:
exec ls
在shell中执行ls,ls结束后不返回原来的shell中了
exec <file
将file中的内容作为exec的标准输入
exec >file
将file中的内容作为标准写出
exec 3<file
将file读入到fd3中
exec 4>file
将写入fd4中的内容写入file中
ls >&4
Ls将不会有显示,直接写入fd4中了,即上面的file中
exec 5<&4
创建fd4的拷贝fd5
exec 3<&-
关闭fd3
示例1如下:
[[email protected] jexusbak]#
[[email protected] jexusbak]# pwd
/root/jexusbak
[[email protected] jexusbak]# ls
default fanti qqxdlq2 souhu xdlq2 xdlq2ceshi xunlei
[[email protected] jexusbak]# bash
[[email protected] jexusbak]# exec > test
[[email protected] jexusbak]# ls
[[email protected] jexusbak]# pwd
[[email protected] jexusbak]# exit
exit
[[email protected] jexusbak]# cat test
default
fanti
qqxdlq2
souhu
test
xdlq2
xdlq2ceshi
xunlei
/root/jexusbak
[[email protected] jexusbak]#
如上:在执行exec >ls后,再输入命令ls,pwd不会输出到当前 shell中,而是重定向到test这个文件中,这些都是在一个shell中实现的,并不会产生新pid;关闭的exec请使用
exec <&-
示例2如下:
[[email protected] jexusbak]# cat test
ls
pwd
[[email protected] jexusbak]# bash
[[email protected] jexusbak]# exec < test
[[email protected] jexusbak]# ls
default fanti qqxdlq2 souhu test xdlq2 xdlq2ceshi xunlei
[[email protected] jexusbak]# pwd
/root/jexusbak
[[email protected] jexusbak]# exit
[[email protected] jexusbak]#
如上:我们test中原来有ls,pwd两行命令,我们将test中的内容作为exec的标准输入,则会在屏幕上依次执行这两个命令。
综上所述,我们可以使用此种方法打印日志,而不必逐行命令加重定向生成。
如:exec 100>/tmp/test
exec 1>&100
exec 2>&1
exec 100<&-最后关闭fd,我们要有关闭文件描述符的习惯。