一.文件描述符及重定向
首先在Linux中自带10种文件描述符,分别对应数字字符0~9,但常用的文件描述符就0、1、2三个,分别对应“文件标准输入”、“文件标准输出”、“文件错误输出”。简易的理解,文件的标准输出是指 “能够打印到屏幕上的内容” ,文件的错误输出是“当命令运行错误时,打印到屏幕上的内容”。
1. 重定向符
> 输出重定向到一个文件或设备 覆盖原来的文件
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 在原来的文件内容后面继续添加内容
< 输入重定向到一个程序
下面是文件描述符和重定向的配合使用
2. 文件标准输出
标准输出即为代码正常运行的时候结果,内容形式多样,一般会打印打屏幕上面
下面的两行代码的功能一样,均是将“hello”输入到 result 这个文件里面
sww$ echo hello>result
sww$ echo hello 1>reslut
可见 “1” 是指代 “echo hello” 这部分命令的正常输出,输出的内容是 hello,默认 > 的内容的左边会自带一个1
3.文件错误输出
通过下面的代码,错误输出进行理解:
$ hello >result
-bash: hello: command not found
可见,用相同的代码,是没办法将报错的信息输入到文件里的,所以要使用2来指代错误信息,将其输入到文件中,代码如下:
$ hello 2>result
二.将文件的正常输出和报错信息同时记录到文件当中
对于某些需要长时间运行的代码,我们不能时时刻刻观察记录的运行结果和情况,普遍的方法就是创建文件来记录代码的输出内容
首先看一段代码:
$ cat ltest.sh
echo hello
bash not_exist
#其中的 not_exist 是不存在的一个代码,用于来获得报错信息
直接运行脚本:
$ bash ltest.sh
hello
bash: not_exist: No such file or directory
我们可以看到运行结果有正常输出:hello,也有报错的输出:bash: not_exist: No such file or directory
下面我尝试把这些内容输入到一个文件里
$ bash ltest.sh 1,2>result
bash: not_exist: No such file or directory
$ bash ltest.sh 1>result
bash: not_exist: No such file or directory
$ bash ltest.sh 2>result
hello
以上三个代码都没将我们期望正确和报错输出输入到这个 result 文件里,当然第一行代码是我自己编的,按照最简单逻辑尝试一下输出控制 :-D
正确的方法:
$ bash ltest.sh 1>result 2>&1
$ cat result
hello
bash: not_exist: No such file or directory
有几个值得注意的问题:
1. 其中"1>result" 的中可以省略1,和前面一样
2. “2>&1” 将错误输出追加到标准输出中。当 2 放到 > 的左边时,并非“覆盖”,而是含有追加的输出的涵义,具体的逻辑可见下面的流程图:
3. 为什么“2>&1” 是放在最后
这大概于系统的运行逻辑有关,假如不放在最后面:
$ bash ltest.sh 2>&1 >result
bash: not_exist: No such file or directory
流程变成: