美文网首页Shell 脚本成长笔记
Shell 重定向(六):指定用于输出的文件描述符

Shell 重定向(六):指定用于输出的文件描述符

作者: 赵者也 | 来源:发表于2017-05-20 17:18 被阅读9次

    给一个输出文件指定一个文件描述符的语法如下所示:

    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命令行及脚本编程实例详解

    相关文章

      网友评论

        本文标题:Shell 重定向(六):指定用于输出的文件描述符

        本文链接:https://www.haomeiwen.com/subject/rgjpxxtx.html