天天看点

Linux下的Stdin Stdout Stderr

问题引出

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

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

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

追根溯源

先看 tesh1.sh,如下图,内容很简单, t 表示一条不存在的错误命令.
Linux下的Stdin Stdout Stderr
再解释 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如下图:

Linux下的Stdin Stdout Stderr

./test1.sh > a.log 2 > a.log 对应的a.log如下图:

Linux下的Stdin Stdout Stderr

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