给一个输出文件指定一个文件描述符的语法如下所示:
exec [n]> file
其中,[n] 即是文件描述符,如果不指定 n,则表示标准输出(即文件描述符 1)。
上述的输出重定向会在文件描述符 n 上打开一个用于写入的文件 file。如果文件 file 不存在,则它将被创建,如果文件已存在,则它被清空为 0 字节。
比如,我们执行如下命令:
exec 4> /tmp/output.txt
执行这条命令,Shell 会在文件描述符 4 上打开用于写入的文件 /tmp/output.txt。
现在,我们就可以在文件描述符 4 上向文件 /tmp/output.txt 写入内容,我们执行类似如下的命令:
date >&4
uname -a >&4
在上述的命令中,使用了操作符 “>&”,此时,此操作符并不是我们前面学习过的表示标准输出和标准错误同时重定向的操作符。在这里,它用于复制输出文件描述符。其语法如下所示:
[n]>&word
如果 n 没有指定,则默认使用的是标准输出。如果数字 word 指定的文件描述符没有打开以用于输出,则会发生重定向错误。
所以,上述实例中的两个命令中,是将标准输出复制到了文件描述符 4,命令的输出实际被发送到了文件描述符 4,而文件 /tmp/output.txt 又是在文件描述符 4 上打开以用于被写入。
上述命令的运行结果:
下面我们通过一个脚本实例来进一步学习使用 exec 命令指定用于输出的文件描述符:
#! /bin/bash
LOGFILE=/tmp/logfile.txt
exec 6>&1
exec > $LOGFILE
echo -n "Logfile: "
date
echo "--------------------------------------------------"
echo
echo "Output of \"uname -a\" command"
echo
uname -a
echo; echo
echo "Output of \"df\" command"
echo
df
exec 1>&6 6>&-
echo
echo "== stdout now restored to default == "
echo
uname -a
echo
exit 0
运行结果:
本文参考自 《Linux Shell命令行及脚本编程实例详解 》