问题描述:
最近在写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是存在还是不存在都会在屏幕上显示出来。