stdin、stdout、stderr

2019-12-12  本文已影响0人  马蹄哒

是什么

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

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

做什么

重定向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
./error.sh > capture.txt  # > 等同与 1>

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

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

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


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

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

图4
./error.sh 1> capture.txt 2>&1  #重点 >&
图5
/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

运行结果:

上一篇下一篇

猜你喜欢

热点阅读