一.文件描述符及重定向

首先在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 放到 > 的左边时,并非“覆盖”,而是含有追加的输出的涵义,具体的逻辑可见下面的流程图:

echo将一个文件的内容输入到另一个 echo 1>文件_echo将一个文件的内容输入到另一个

 3. 为什么“2>&1” 是放在最后

这大概于系统的运行逻辑有关,假如不放在最后面:

$ bash ltest.sh 2>&1 >result
bash: not_exist: No such file or directory

流程变成:

echo将一个文件的内容输入到另一个 echo 1>文件_linux_02