linux 文件描述符 0 1 2

在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

以这样格式的命令启动进程时,进程就不再删除旧文件,新建一个文件了,而是直接追加到原来的文件中

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值