Linux下的Stdin Stdout Stderr

问题引出

在Linux下进行日常操作时,尤其是当执行bash脚本时,经常会看到在执行脚本命令后面会紧跟一个2>&1的命令,比如命令:

    ./test1.sh > a.log   2>&1

以前碰到总是Ctrl+C和Ctrl+V,今天下午学习了一下,算是知其然也知其所以然了,记录一下。

追根溯源

先看 tesh1.sh,如下图,内容很简单, t 表示一条不存在的错误命令.

这里写图片描述

再解释 0 1 2 分别代表的含义:
  • 0表示stdin 表示标准输入
  • 1表示stdout 表示标准输出
  • 2表示stderr 表示标准错误
接下来解释 ./test1.sh > a.log
    ./test1.sh > a.log  等同 ./test1.sh 1 > a.log   也就是说将test1.sh这个脚本执行标准输出结果(1)写入a.log

简单说标准输出 1 是可以省略不写的,前者是后者的省略情况

重点说2>&1
2 > &1  

2表示标准错误(对应test1中t这个命令触发的错误)  

>表示输出定向符

&1表示标准输出对应的文件地址,在本例中由于标准输出对应的文件是a.log(依据是1 > a.log), 所以标准错误的信息也会存储到a.log里面

    简单解释下 2 > &1 表示如果我的test1在执行过程中出现了标准错误的信息,那么我的标准错误的存储信息的存储位置就是标准输出的存储位置(&1表示引用标准输出的存储位置)

细节部分
./test1.sh > a.log   2>&1 是否等于./test1.sh > a.log  2 > a.log ?

    答案是否定的。 2>&1只会打开一次a.log文件,而 2 > a.log 会重新打开文件,在本例中如果换成后者,那么date的输出就会把t这个命令产生的标准错误信息给覆盖掉。


./test1.sh > a.log 2>&1 对应的a.log如下图:
这里写图片描述
./test1.sh > a.log 2 > a.log 对应的a.log如下图:
这里写图片描述

可见丢失的信息就是被覆盖掉的信息。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值