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

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

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

    Shell 允许你给一个输入文件或输出文件指定一个文件描述符。这样可以提高文件读取和写入的性能。这类文件描述符被称为用户自定义文件描述符。

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

    exec [n]< file
    

    其中,[n] 即文件描述符,如果不指定 n,则表示标准输入(即文件描述符 0)。

    上述的输入重定向会在文件描述符 n 上打开一个用于读取的文件 file。

    例如,执行如下命令,将文件描述符 3 指定给文件 /etc/passwd 以用于从中读取数据:

    exec 3< /etc/passwd
    

    现在我们就可以在文件描述符 3 上读取此文件的内容,比如,使用 grep 命令来查找指定账号的信息:

    grep toby <& 3
    

    上述命令中,我们使用了操作符 “<&”,它也是一种重定向操作符,用于复制输入文件描述符。其语法如下所示:

    [n] <& word
    

    如果 word 是一个数字,则用 n 表示的文件描述符被作为文件描述符 word 的副本。如果数字 word 指定的文件描述符没有打开以用于读取,则会发生重定向错误。如果没有指定 n,则默认为标准输入。

    所以,在上述的 grep 命令中,是将文件描述符 3 复制到标准输入,而文件 /etc/passwd 又是在文件描述符 3 上打开以用于被命令读取,因此,grep 命令读取的实际是文件描述符 3 的内容。

    在下面的脚本中,我们从指定的文件描述符来读取文件的内容:

    #! /bin/bash
    
    if [ $# -ne 1 ] || [ ! -f $1 ]; then
        echo "Usage: $0 <FILEPATH>"
        exit 1
    fi
    
    # 将脚本的第一个参数作为输入文件,并制定一个文件描述符 3
    exec 3< $1
    
    cat <& 3
    
    # 关闭文件描述符 3
    exec 3<&-
    

    运行结果:

    运行结果

    下面我们再通过一个实例,来进一步学习使用 exec 命令指定用于输入的文件描述符:

    #! /bin/bash
    
    # 将标准输入复制到文件描述符 6,保存标准输入
    exec 6<&0
    
    # 将文件 /etc/hosts 重定向到标准输入
    exec < /etc/hosts
    
    # 读取 /etc/hosts 的第一行,并将读取的内容存入变量 a1
    read a1
    
    read a2
    
    echo
    echo "Following lines read from file."
    echo "-------------------------------"
    echo $a1
    echo $a2
    
    echo; echo; echo
    
    # 现在从文件描述符 6 中恢复标准输入,并关闭文件描述符 6 以释放给其他进行使用
    exec <&6 6<&-
    
    echo -n "Enter data: "
    
    read b1
    echo "Input read from stdin."
    echo "------------------------------"
    echo "b1 = $b1"
    echo
    

    此脚本的运行结果:

    运行结果

    本文参考自 《Linux Shell命令行及脚本编程实例详解

    相关文章

      网友评论

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

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