美文网首页
stdin、stdout、stderr

stdin、stdout、stderr

作者: 马蹄哒 | 来源:发表于2019-12-12 17:13 被阅读0次

    是什么

    Linux的三种标准数据流,执行Linux命令时自动创建

    Linux 像处理文件一样对待数据流(可写可读),三种数据流的描述符如下
    0:stdin 标准输入流(输入)
    1:stdout 标准输出流(输出)
    2:stderr 标准异常流(输出)

    做什么

    • Linux进程并不关心这三种数据流从哪里来,到哪里去。
    • 我们可以指定三种数据流的处理方式:直接输出(默认)、重定向到文件(>)、传递给其他命令(|)

    重定向stdout和stderr

    1. 创建一个error.sh文件
    #!/bin/bash
    
    echo "About to try to access a file that doesn't exist"
    cat bad-filename.txt
    
    1. 给文件执行权限
    chmod +x ./error.sh
    
    1. 运行脚本
    ./error.sh
    

    图1可以看到stdout、stderr都直接输出:

    图1
    • 重定向stdout
    ./error.sh > capture.txt  # > 等同与 1>
    

    图2可以看出,stdout写入到文件capture.txt,如果要重定向stderr怎办呢?

    图2
    ./error.sh 2> capture.txt
    

    图3可以看出,stderr写入到文件capture.txt,如果要同时重定向stdin、stderr怎办呢


    图3
    • 同时重定向stdout、stderr
    ./error.sh 1> capture.txt 2>error.txt
    

    图4可以看出stdout、stderr分别写到不同的文件,如果要写到同一个文件怎么办呢?

    图4
    • 同时重定向stdout、stderr到同一个文件
    ./error.sh 1> capture.txt 2>&1  #重点 >&
    
    图5
    • 同时隐藏stdout、stderr
      重定向到/dev/null文件即可
    /error.sh 1>/dev/null 2>&1
    

    如何识别stdin来源

    1. 创建一个input.sh文件
    #!/bin/bash
    
    if [ -t 0 ]; then
        echo 'stdin comming from keyboard'
    else
        echo 'stdin comming from pip or a file'
    fi
    
    1. 给文件执行权限
    chmod +x ./input.sh
    
    1. 运行脚本
    ./input.sh
    ./input.sh < test.txt
    cat test.txt | ./input.sh
    

    运行结果:

    Screen Shot 2019-12-12 at 16.57.54.png

    如何识别stdout去向

    1. 创建一个output.sh文件
    #!/bin/bash
    
    if [ -t 1 ]; then
        echo 'stdout is going out to the terminal window'
    else
        echo 'stdout is being redirected or piped'
    fi
    
    1. 给文件执行权限
    chmod +x ./output.sh
    
    1. 运行脚本
    ./output.sh
    ./output.sh > capture.txt
    ./output.sh | cat
    

    运行结果:

    相关文章

      网友评论

          本文标题:stdin、stdout、stderr

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