问题描述:
最近在写 crontab 的时候, 看到一条 0 10 sh /abc/f.sh > /abc/log 2>&1 大致长成这样的一条定时任务。不知道最后面的 2 >&1 是起什么作用的, 然后就去学习了一下。
问题分析:
1. 首先我们看前面的 0 10 sh /abc/f.sh > /abc/log, 这个比较好理解,意思是每天的 10 点整去执行 f.sh 脚本, 并且将标准输出重定向到 log 文件中 2. 我们再来看后面的 2 >&1,然后我们还得知道一个概念,文件描述符,可以参考下,wiki 对文件描述符的简绍和文件描述符的原理链接。简单的来说就是有一个整数,它的枚举值是 0(标准输入),1(标准输出),2(标准错误),然后 0 是从键盘输入,1 和 2 都是输出到屏幕上。3. 我们了解了整数的含义之后再来看就比较好理解了,对于重定向符号 ”>”, 我们可以这么理解: 文件描述符 > 文件. 比如 ls > a.txt, 就是说把 ls 的输出存入 a.txt, > 等于 1 >, 所以写成 ls 1> a.txt 也是一样的效果. 如果 > 后面是 &1 就是用来表示这是文件描述符. 4.0 10 sh /abc/f.sh > /abc/log 2>&1 所以这个命令就是说把执行结果的标准输出放入到 log 文件,又因为 2 >&1(标准错误也重定向到标准输入,之前标准输入已经重定向到了 log), 因此这个命令的正确执行和报错都会放入到 log 文件中。
实例:
我们可以看下面的两个例子:1. 首先由 f,log 两个文件,ll f1 > log 2 >&1, 意思是标准输出和错误都输出到 log 中, 所以 cat log 中有错误信息。2. 再看第二个, 首先由 f,log 两个文件,ll f2 > log >&2, 意思是标准输出重定向到 log 中, 标准输出又重定向到标准错误中, 因为标准错误是输出到屏幕的, 所以不管 ll f2 是存在还是不存在都会在屏幕上显示出来。