什么是数据流?
数据流分三种,标准输入流(stdin)、标准输出流(stdout)、标准错误输出流(stderr)
标准输入流默认由键盘输入产生,标准输出流是执行命令时的输出日志,这些日志包含正常的日志输出与命令扫行失败的错误输出,即标准输出流与标准错误输出流
什么是数据流重定向?
将本应由键盘输入或输出到屏幕上的数据流重定向到文件或设备上(保存到文件或设备中),称之为数据流重定向
数据流重定向的作用(应用场景)
- 屏幕输出信息需要保存
- 后台执行程序,不想将日志打在桌面上
- 区分输出标准输出与标准错误输出处理时
- 丢弃已知错误信息,
2> /dev/null
数据流的代号与表现方式
- 标准输入(stdin):代码
0
,使用<
或<<
表示 - 标准输出(stdout):代码
1
,使用>
或>>
表示 - 标准错误输出(stderr):代码
2
,使用2>
或2>>
表示
>、>>、2>、2>> 区别
-
>
:以【覆盖】的方式,将【正确的数据】输出到文件或设备上 -
>>
:以【追加】的方式,将【正确的数据】输出到文件或设备上 -
2>
:以【覆盖】的方式,将【错误的数据】输出到文件或设备上 -
2>>
:以【追加】的方式,将【错误的数据】输出到文件或设备上
黑洞 /dev/null
当需要将某些日志不重要的数据流重定向走,但又不想保存文件占用空间时,重定向数据流 /dev/null
设备上,相当于将数据丢入黑洞
示例:
将标准输出丢入黑洞
$ cat /etc/profile > /dev/null
将标准错误输出丢入黑洞
$ find / -name .bashrc 2> /dev/null
将stdout与stderr输出到同一文件或设备
非root用户没有权限访问其他用户家目录,会输出错误日志,以下例子由此产生错误信息
1、【反例】分别设置stdout与stderr到同一文件
$ find / -name .bashrc > /tmp/stdtestlogs1 2> /tmp/stdtestlogs1
输入流交叉,会导致文件内容次序错乱
2、【正例1】输出两者到同一文件,语法1 [command]> [file] 2>&1
$ find / -name .bashrc > /tmp/stdtestlogs2 2>&1
3、【正例2】输出两者到同一文件,语法2 [command] &> [file]
$ find / -name .bashrc &> /tmp/stdtestlogs3
4、将所有日志输入黑洞
$ find / -name .bashrc > /dev/null 2>&1
5、将错误日志输入黑洞
$ find / -name .bashrc 2> /dev/null
标准输入流重定向 < 与 <<
即,将原本由键盘输入的数据,改由文件内容提供
在标准输入流重定向中,<
与 <<
作用不是覆盖与追加了,<
表示使用文件提供数据,<<
用来【设置输入结束的字符】
【例1】:将 ~/.bashrc
输出重定向到 /tmp/stdintest
中
$ cat > /tmp/stdintest < ~/.bashrc
【例2】:设置【输入结束字符】,将一段文字输入到 /tmp/stdintest2
中
$ cat > /tmp/stdintest2 <<EOF
这是一条测试
这是一条测
这是一条
这是一
这是
这
EOF
总结自鸟哥私房菜第四版