输出重定向
今天杰哥让我在手机shell中查找一个文件,然后让我用find命令,但是该手机的shell有点问题,在查找的时候会不断报错。那怎么找到我需要的文件路径呢,只见我师父小手一挥,在命令行敲出这一段命令$find -name filename 2>/dev/null
,结果什么也没有输出。我马上质疑道,这个“>”重定向不是把所有的输出都放到/dev/null里面了,怎么可能找到想要的信息。我师父马上反驳道,一看你就不了解重定向,我马上解释道,我知道重定向也知道定向到/dev/null里面是什么意思,但是我没见过在前面加个“2”的,然后我师父就让我自己去查一下,仔细了解一下。我一查,果不其然,还是我才疏学浅,“2”指的是文件描述符,也就是stderr,Unix三个最基本的文件描述符0,1,2,分别对应stdin,stdout,stderr。那就很好理解了,“2>”的意思就是将所有的stderr都定向到/dev/null中,但是stdout并不会被定向进去,因而会输出出来,这也就是利用文件描述符对重定向内容进行过滤,十分的实用。
1.关于输出重定向的详细理解
ls . >test.1
该条命令就是将ls命令获得的输出流,重定向到文件test.1中,如果没有该文件,则会新建该文件。
该命令省略了“>”前面的“1”,当我们不指定0/1/2时,会默认他为1,也就是stdout。
lt test.1 2> test.2
因为我们shell里面没有“lt”命令,所以当我们用他的时候,就会产生一条stderr,但是我们将stderr重定向到了test.2里面,所以在命令行并不会有什么显示,但是我们cat test.2
的时候,就会看到刚才产生的stderr。如果对这两个例子都了解了,那么对重定向就有一定的认识了。如果想加深了解,建议可以看一下Unix文件描述符相关的内容。
2.总结一下
- command > filename 把标准输出重定向到一个新文件中
- command >> filename 把标准输出重定向到一个文件中(追加)
- command 1 > fielname 把标准输出重定向到一个文件中
- command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
- command 2 > filename 把标准错误重定向到一个文件中
- command 2 >> filename 把标准输出重定向到一个文件中(追加)
- command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
- command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
- command < filename 把command命令以filename文件作为标准输入
- command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
- command <&m 把文件描述符m作为标准输入
- command >&m 把标准输出重定向到文件描述符m中
- command <&- 把关闭标准输入
3.双重重定向
- tee [-a] file
即在重定向数据到目标文件的同时,还要保证数据能够正常输出,使用tee命令。-a 表示往文件尾添加内容。 - last | tee last_backup
相当于备份了一遍last的输出。