bash中 2>&1 & 的解释

一、首先,bash中0,1,2三个数字分别表明STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(通常是键盘),标准输出(通常是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。shell

二、输入输出能够重定向,所谓重定向输入就是在命令中指定具体的输入来源,譬如 cat < test.c 将test.c重定向为cat命令的输入源。输出重定向是指定具体的输出目标以替换默认的标准输出,譬如ls > 1.txt将ls的结果从标准输出重定向为1.txt文本。有时候会看到如 ls >> 1.txt这类的写法,> 和 >> 的区别在于:> 用于新建而>>用于追加。即ls > 1.txt会新建一个1.txt文件而且将ls的内容输出到新建的1.txt中,而ls >> 1.txt则用在1.txt已经存在,而咱们只是想将ls的内容追加到1.txt文本中的时候。
bash

三、默认输入只有一个(0,STDIN_FILENO),而默认输出有两个(标准输出1 STDOUT_FILENO,标准错误2 STDERR_FILENO)。所以默认状况下,shell输出的错误信息会被输出到2,而普通输出信息会输出到1。可是某些状况下,咱们但愿在一个终端 下看到全部的信息(包括标准输出信息和错误信息),要怎么办呢?测试

       对了,你可使用咱们上面讲到的输出重定向。思路有了,怎么写呢? 很是直观的想法就是2>1(将2重定向到1嘛),行不行呢?试一试就知道了。咱们进行如下测试步骤:test

1)mkdir test && cd test                ; 建立test文件夹并进入test目录后台

2)touch a.txt b.c c                          ; 建立a.txt b.c c 三个文件终端

3)ls > 1                                           ; 按咱们的猜想,这句应该是将ls的结果重定向到标准输出,所以效果和直接ls应该同样。可是实际这句执行后,标准输出中并无任何信息。重定向

4)ls                                                  ; 执行3以后再次ls,则会看到test文件夹中多了一个文件1touch

5)cat 1                                            ; 查看文件1的内容,实际结果为:1 a.txt b.c c     可见步骤3中 ls > 1并非将ls的结果重定向为标准输出,而是将结果重定向到了一个文件1中。即1在此处不被解释为STDOUT_FILENO,而是文件1。di

四、到了此时,你应该也能猜到2>&1的用意了。不错,2>&1就是用来将标准错误2重定向到标准输出1中的。此处1前面的&就是为了让bash将1解释成标准输出而不是文件1。至于最后一个&,则是让bash在后台执行。文件

相关文章
相关标签/搜索