exec命令可以通过文件标识符打开或关闭文件,也可以将文件重定向到标准输入,及将标准输出重定向到文件。
1.将标准输入重新定向到文件,以及通过其他的FD(文件描述符或者句柄)文件恢复到标准输入
#!/bin/bash
exec 8<&0 #FD0复制到FD8 ,同时打开FD8文件
exec <hfile #等价与 0<hfile (hfile为文件名称)
read a
read b
echo "------------------"
echo $a
echo $b
echo "Close FD 8:"
exec 0<&8 8<&- #将FD8复制到FD0,恢复FD0; 关闭FD8
echo -n "Pls. Enter Data:"
read c
echo $c
2.将标准输出重新定向到文件,以及通过其他的FD(文件描述符或者句柄)文件恢复到标准输出
#!/bin/bash
exec 8>&1 #FD8是FD1的副本用于恢复FD1
exec 1>hfile # == 1>hfile 将标准输出定向到hfile
echo "Output of date command"
date
echo "Output of df command"
df
exec 1>&8 8>&- #恢复标准输出
echo "--------------"
echo "Output of date command"
date
echo "Output of df command"
df
总结:
符号 | 意义 |
n>&m | 将FD为m的输出复制到FD为n的文件 |
n<&m | 将FD为m的输入复制到FD为n的文件 |
n>&- | 关闭FD为n的输出 |
n<&- | 关闭FD为n的输入 |
&>file | 将标准输出和标准错误输出定向到文件file |
>重定向输出
<重定向输入
&- 关闭输入或者输出(取决与前面的 '<' 或者 '>')
&>file 则比较特殊
shell文件描述符(转自:http://hi.baidu.com/zdd8231/item/d745c80a240627e1fe240d7c)
打开文件描述符
Shell中,0、1、2也是默认可用的三个文件描述符。为了利用其他文件描述符来标识特定文件,我们需要使用exec命令打开该文件,并指定一个数字作为描述符:
exec m> outfile
exec n< infile
第一行打开文件outfile,并赋予文件描述符m,第二行打开文件infile,并赋予文件描述符n。
复制文件描述符
符号<&可以复制一个输入文件描述符,符号>&可以复制一个输出描述符。例如下面命令打开文件描述符n,并将其作为文件描述符m的副本:
exec n<&m
关闭文件描述符
exec n<&-
exec m<&-