数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他地方去
如果我们要执行一个命令,它通常是这样的:
stdin | 标准输入 | 0 |
stdout | 标准输出 | 1 |
stderr | 标准错误输出 | 2 |
标准输入(stdin):代码为0,使用<或<<
标准输出(stdout):代码为1,使用>或>>
标准错误输出(stderr):代码为2,使用2>或2>>
标准输入(stdin)
我们使用ll命令后会发现屏幕上显示出了文件信息
我们将屏幕中的信息重定向到一个文件中,因此屏幕中不会再显示任何信息(这股数据流已经重定向另一个目的地)
查看重定向到的目标文件
我么发现我们可以使用重定向来把本来显示在屏幕上的数据流换个目标存放/显示信息
>:以覆盖的方式将正确的数据输出到指定的文件或设备上
>>:以累加的方式将正确的数据输出到指定的文件或设备上
标准错误输出(stderr)
我们通过上文可以知道
>:覆盖重定向(把文件内容清空后再将数据写入,即覆盖原内容)
>>:追加重定向(在文件内容结尾追加写入数据,即不覆盖原内容)
而>与>>默认代表的是1>和1>>(标准输入),所以2>和2>>代表的就是标准错误输出
2>:以覆盖的方式将错误的数据输出到指定的文件或设备上
2>>:以累加的方式将错误的数据输出到指定的文件或设备上
举个几个例子来理解吧
使用一般账号查找/home下的.bashrc文件是否存在
显示的有一个正确信息(查找到的路径)与错误信息(权限被拒绝了)
使用标准输出后会发现错误信息没有被重定向
所以我们在标准输出后还需要标准错误输出,此时屏幕不会有任何信息
显示正确信息,丢弃错误信息
但是当我们需要把正确数据与错误数据都写入一个文件,就需要特殊写法了
这两种写法都是可以的
补充:这种写法虽然可以,但是由于两股数据同时写入一个文件,有没有使用特殊语法,此时两股数据可能会交叉写入该文件,造成次序混乱
标准输入(stdin)
标准输入就是将原本需要由键盘输入的数据,改由文件内容来替换
<理解
我们使用标准输出来建立文件并输入文本(>加在cat后面,catfile文件会被主动建立),输入完成后使用Ctrl+d来结束输入
利用标准输入<来代替键盘输入达到复制粘贴的作用
<<理解
<<表示的是结束的输入字符
当文件中的内容输入到关键字(结束输入字符)时,就会结束此次输入而不必去按下Ctrl+d
总结
使用命令输出重定向的常见场景
- 屏幕的输出信息很重要,而且我们需要将它保存下来的时候
- 后台执行的程序,不希望它干扰屏幕正常的输出结果时
- 一些系统的计划任务命令(列如写在/etc/crontab中的文件)的执行结果,希望它可以存下来时
- 一些执行命令的可能已知错误信息时,想以2> /dev/null来将它丢弃时
- 错误信息与正确信息需要分别输出时