文件描述符

Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。其实我们可以想象我们电脑的显示器和键盘在Linux系统中都被看作是文件,而它们都有相应的文件描述符与之对应。
Linux启动的时候会默认打开三个文件描述符:
0—–>默认键盘设备
1—–>默认显示器设备
2—–>默认显示器设备

描述符0,1,2指向的文件(linux下一切皆文件,鼠标、键盘等都是文件)

重定向

重定向为分为两类:输入重定向、输出重定向
首先,我们需要知道,bash在执行一条指令的时候,首先会从左到右解析,检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向(重定向输入输出本质上就是重定向文件描述符),然后再执行指令

输入重定向”<”

[n] < [file]      //描述符n重定向到file指向的文件,n往往可以省略,默认为0

例如

“< 1.txt”表示让文件描述符0指向文件1.txt,而后执行cat命令时,则从1.txt中获取内容

输出重定向”>”

[n] > [file]      //描述符n重定向到file指向的文件,n往往可以省略,默认为1

例如

“> 2.txt”表示文件描述符1指向了2.txt,执行echo时,本应该将内容输出在显示器上,但是结果并没有,因为标准输出此时指向2.txt,因此内容被输出到了2.txt,我们可以查看2.txt来进行验证
PS(1>2.txt和>2.txt效果是一样的,因为1可以省略)
另外”>”为覆盖,”>>”为追加,如果重定向的文件不为空,”>”会将文件先清空后输出,如果不希望原文件内容被清空则可以用”>>”.

但我们会发现,在进行输出重定向时,如果命令出现错误,错误信息仍会打印在显示器上而非重定向的文件里

如果我们希望错误信息也不要输出到默认显示器,那我们也可以对错误输出进行重定向
例如

是的,我们只需要将文件描述符参数设为2,就可以将错误输出重定向到2.txt文件.

假如我们希望错误输出可以跟标准输出指向同一个文件,但是分别重定向又会麻烦,所以可以使用这样的命令

2>&1      //&类似于取地址符,&1的含义是文件描述符1所指向的文件,而并非文件名为1的文件

上面就是最基本重定向的内容了,但是还有其他衍生的表达方式,但是核心思想还是如上所说