美文网首页
1.6 玩转文件描述符及重定向

1.6 玩转文件描述符及重定向

作者: 拙言_Coder | 来源:发表于2019-03-05 13:56 被阅读0次

    《Linux Shell 脚本攻略(第 2 版)》读书笔记

    文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0 、 1以及2是系统预留的。

    • 0 —— stdin(标准输入)
    • 1 —— stdout(标准输出)
    • 2 —— stderr(标准错误)

    将输出文本重新定向或保存到一个文件中

    echo "This is a sample text 1" > temp.txt
    

    将文本追加到目标文件中

    echo "This is a sample text 2" >> temp.txt
    

    标准错误

    当命令输出错误信息时,stderr 信息就会被打印出来。

    ls +            # + 是一个非法参数
    ls: cannot access +: No such file or directory
    

    成功和不成功的命令

    当一个命令发生错误并退回时,它会返回一个非 0 的退出状态;而当命令成功完成后,它会返回数字 0。退出状态可以从特殊变量 $? 中获取(在命令执行后立刻运行 echo $?,就可以打印出退出状态)。

    将 stderr 重定向到 out.txt:

    ls + 2> out.txt
    

    可以将 stderr 单独重定向到一个文件,将 stdout 重定向到另一个文件:

    cmd 2>stderr.txt 1>stdout.txt
    

    还可以将 stderr 转换成 stdout,使得 stderr 和 stdout 都被重定向到同一个文件中:

    cmd &> output.txt
    

    舍弃错误信息

    cmd 2>/dev/null
    

    既可以将数据重定向到文件,还可以提供一份重定数据的副本作为后续命令的 stdin

    下面的代码中,tee 命令接收到来自 stdin 的数据。它将 stdout 的一份副本写入 out.txt,同时将另一份副本作为后续命令的 stdin。命令 cat -n 将从 stdin 中接收到的每一行数据前奖赏行号并写入 stdout:

    $ cat a* | tee out.txt | cat -n
    cat: a1: Permission denied
         1  a1
         2  a1
    

    注意,tee 只能从 stdin 中读取。

    默认情况下,tee 命令会将文件覆盖,但是它提供了一个 -a 选项,用于追加内容

    cat a* | tee -a out.txt | cat -n
    

    将文件重定向到命令

    cmd < file
    

    将脚本内部的文本进行重定向

    #!/bin/bash
    cat << EOF > log.txt
    LOG FILE HEADER
    This is a test log file 
    Function: System statistics
    EOF
    

    cat <<EOF>log.txt 与下一个 EOF 行之间的所有文本行都会被当做stdin数据。

    自定义文件描述符

    可以使用 exec 命令创建自己的文件描述符。

    • < 操作符用于从文件中读取值 stdin (只读模式
    • > 操作符用于截断模式的文件写入
    • >> 操作符用于追加模式的文件写入

    创建一个文件描述符进行文件读取:

    exec 3<input.txt    #创建
    cat <&3             #使用
    

    创建一个文件描述符用于写入(截断模式)

    exec 4>output.txt
    echo newline >&4
    

    创建一个文件描述符用于写入(追加模式)

    exec 5>>output.txt
    echo appended line >&
    

    相关文章

      网友评论

          本文标题:1.6 玩转文件描述符及重定向

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