在Shell脚本中经常看到数字0,1,2,到底是什么意思,这篇文章简单归纳总结
文本描述0,1,2
在Linux和unix系统中,文件描述符0,1,2是系统预留的,每个程序在运行后,都会至少打开三个文件描述符,分别是0、1、2,它们的意义分别有如下对应关系:
-
0 —— stdin (标准输入)
-
1 —— stdout (标准输出)
-
2 —— stderr (标准错误)
其中,shell脚本中经常用到的就是描述符1,和描述符2。举个栗子说明:
[root@master test]# pwd #在/root/test目录下测试
/root/test
[root@master test]# touch test.txt #新建一个test.txt文件,这里的test.txt文本就是stdin(标准输入)
[root@master test]# ls #执行ls命令会输出一个结果,输出的text.txt就是stdout (标准输出)
test.txt
[root@master test]# ls nothing.txt #执行ls命令查看一个不存在的文件,下面输出的就是stderr (标准错误)
ls: cannot access nothing.txt: No such file or directory
上面的例子中
-
执行 touch test.txt 命令
中的test.txt
就是 0 — stdin(标准输入), -
执行
ls
命令会输出当前文件目录的内容,输出的文本就是1 — stdout (标准输出) -
执行
ls nothing.txt
查询一个不存在的文件,肯定会抛出错误,下面输出的结果就是2 — stderr (标准错误)
下面示例,如何将标准输出重定向到指定文件stdout.txt中:
[root@master test]# ls 1> stdout.txt
[root@master test]# ls
stdout.txt test.txt
[root@master test]# cat stdout.txt
stdout.txt
test.txt
[root@master test]#
可以看到ls的输出结果和文件stdout中的内容完全一致
下面示例,如何将标准错误重定向到文件stderr.txt中:
[root@master test]# ls nothing.txt 2> stderr.txt
[root@master test]# cat stderr.txt
ls: cannot access nothing.txt: No such file or directory
[root@master test]#
可以看到ls的错误输出结果已经写入到文件stderr.txt中了
文本描述0,1,2的几种常见用法
在shell中经常是通过管道,重定向等使用这些文件描述符。
1. 重定向到/dev/null
/dev/null
是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。因此,null这个设备通常也被成为位桶(bit bucket)或黑洞,这个就好像一个能吸纳所有东西的无底洞一样。
下面即是将错误输出丢弃的用法:
$cat logcat.log 2> /dev/null |grep compiled
即打印logcat.log,将错误信息重定向到黑洞,标准输出作为grep的输入,过滤出包含compiled
字段的信息。
2. 将标准输出与错误输出分开重定向
cmd 2>stderr.txt 1>stdout.txt
将cmd的结果中,正确的重定向到stdout.txt,错误的重定向到stderr.txt中。
3. 将标准输出和错误输出重定向到一个文件中
cmd> output.txt 2>&1
即是将cmd的结果也就是标准输出重定向到output.txt,后面的2>&1
表示,将错误输出2-stderr叠加到1-stdout.txt中。
4. 追加式地重定向到指定文件
前面说的1>stdout.txt,2>stderr.txt 这样的格式,都是重建式的重定向,也就是每次启动进程都是新建一个log文件,再把内容重定向进去
有时候我们希望不要覆盖之前的log文件,这样以后还能查询特定的log,那该怎么办呢?
也很简单,只需要用格式:1>>stdout.txt 这样的命令,即把>改成两个>
比如 1>>stdout.txt
比如 2>>stderr.txt
以这样格式的命令启动进程时,进程就不再删除旧文件,新建一个文件了,而是直接追加到原来的文件中