stdin、stdout、stderr
2019-12-12 本文已影响0人
马蹄哒
是什么
Linux的三种标准数据流,执行Linux命令时自动创建
Linux 像处理文件一样对待数据流(可写可读),三种数据流的描述符如下
0:stdin 标准输入流(输入)
1:stdout 标准输出流(输出)
2:stderr 标准异常流(输出)
做什么
- Linux进程并不关心这三种数据流从哪里来,到哪里去。
- 我们可以指定三种数据流的处理方式:直接输出(默认)、重定向到文件(>)、传递给其他命令(|)
重定向stdout和stderr
- 创建一个error.sh文件
#!/bin/bash
echo "About to try to access a file that doesn't exist"
cat bad-filename.txt
- 给文件执行权限
chmod +x ./error.sh
- 运行脚本
./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来源
- 创建一个input.sh文件
#!/bin/bash
if [ -t 0 ]; then
echo 'stdin comming from keyboard'
else
echo 'stdin comming from pip or a file'
fi
- 给文件执行权限
chmod +x ./input.sh
- 运行脚本
./input.sh
./input.sh < test.txt
cat test.txt | ./input.sh
运行结果:
Screen Shot 2019-12-12 at 16.57.54.png如何识别stdout去向
- 创建一个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
- 给文件执行权限
chmod +x ./output.sh
- 运行脚本
./output.sh
./output.sh > capture.txt
./output.sh | cat
运行结果: