什么是数据流向重导?
一般地说,如果执行一个指令,通常是如下流程:
说明:
- Standard output:标准输出(STADOUT)
- Strandard error output:标准错误输出(STADERR)
以上两个内容默认都是输出到屏幕上去。简单的说,标准输出指的是「命令执行所回传的正确的信息」;标准错误输出指的是「命令执行失败后,所传回的错误信息」.
无论正确与否,数据默认都输出到屏幕上,屏幕就会杂乱无章。那么能不能通过某种手段,将两股数据分开呢?答案是可以的,这就是数据流向重导。传送所用的特殊字符规则如下:
- 标准输入(STADIN):代码为0,使用
<
或<<
- 标准输出(STADOUT):代码为1,使用
>
或>>
- 标准错误输出(STADERR):代码为2,使用
2>
或2>>
注意:1>;1>>;2>;2>>
中间无空格
STADOUT和STADERR
标准输出数据流向重导
将家目录下的文件信息重导到stad_01.txt文件中
ll / > stad_01.txt
文件建立流程:
- 如果stad_01.txt不存在,则系统会自动创建
- 当stad_01.txt存在,则会先将其内容清空,然后写入数据
如果不想覆盖stad_01.txt中的内容应该怎么做?答案如下:
ll / >> stad_01.txt
标准错误输出数据流向重导
如果是STADERR的错误数据呢?那就应该通过2>
或2>>
数据流向重导了。
假设现在想要执行find / -name .bashrc
命令,会因为权限问题产生一些find: /root: Permission denied
之类的错误信息。
此时就需要将STADERR和STADOUT产生的文件分离开:
# 正确信息导入right.txt;错误信息导入wrong.txt。此时屏幕不会显示任何信息
find /Users -name .bashrc > right.txt 2> wrong.txt
/dev/null垃圾桶黑洞装置和特殊写法
如果想忽略到错误信息不显示页不存储呢?这个时候就要用到“黑洞”了。
比如将find /Users -name .bashrc
的错误信息导入“黑洞”中,正确信息输出到屏幕:
find /Users -name .bashrc 2> /dev/null
那么如果想将正确信息和错误信息都导向同一个文件呢?这个时候就需要有特殊的写法了:
# 都导入黑洞
find /Users -name .bashrc 1> /dev/null 2>&1
# 都导入result.txt文件中
find /Users -name .bashrc > result.txt 2>&1
# 错误写法,虽然能顺利执行,但是「正确信息」和「错误信息」会无序
find /Users -name .bashrc > result.txt 2>result.txt
说明:&
代表「等同」的意思,2>&1
代表「2的导向等同1的导向」,如果「1导向到result.txt」中,那么「2也导向到result.txt」中。
STADIN
了解了STADOUT和STADERR后,再来看安STADIN。简单的说STADIN就是「将原本由键盘输入的数据,改成由文件内容取代」。
将/etc/profile的内容输入到stadin.txt中
cat > stadin.txt < /etc/profile