标准输入输出

Linux 中三种标准输入输出:

  • STDIN:标准输入,默认从键盘读取信息
  • STDOUT:标准输出,默认将输出结果输出至终端
  • STDERR:标准的错误信息,默认也会显示在终端上

由于STDOUTSTDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT2表示STDERR0表示:STDIN

案例分析

/tmp/test.sh > /tmp/test.log 2>&1,这里2>&1的意思就是将标准错误也输出到标准输出当中。

编写test.sh文件测试:

1
2
3
4
5
# test.sh
echo '----run cmd date----'
date
echo '----run cmd abc----'
abc

赋予可执行权限x,并执行查看输出结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
➜  ~ chmod +x test.sh
➜  ~ cat test.sh
echo '----run cmd date----'
date
echo '----run cmd abc----'
abc
➜  ~ ./test.sh
----run cmd date----
Mon Apr 27 15:43:42 CST 2020
----run cmd abc----
./test.sh: 4: ./test.sh: abc: not found

通过./test.sh > test.log这种方式,可以看到错误的信息并没有被追加到test.log而是输出了,结果如下:

1
2
3
4
5
6
➜  ~ ./test.sh > test.log
./test.sh: 4: ./test.sh: abc: not found
➜  ~ cat test.log
----run cmd date----
Mon Apr 27 15:44:21 CST 2020
----run cmd abc----

那如果是在crontab中执行,这样的错误我们如何也记录test.log中呢?看下面写法:

1
2
3
4
5
6
➜  ~ ./test.sh > test.log 2>&1
➜  ~ cat test.log
----run cmd date----
Mon Apr 27 15:53:12 CST 2020
----run cmd abc----
./test.sh: 4: ./test.sh: abc: not found

错误输出也被记录到test.log了,2>&1表示:将标准错误也输出到标准输出当中。

补充:

./test.sh > /dev/null 2>&1/dev/null表示空设备,整句意思标准输出重定向到空设备文件,当然也不会输出任何信息到终端。