首先说什么是1,什么是2:
1代表标准输出,2代表标准错误输出,都默认输出到屏幕。
再说为什么是2>&1而不是2&>1,首先后者&>这种写法是存在的,代表将标准输出和标准错误输出都重定向。
2>&1是一部分,一种固定写法,代表将标准错误输出重定向到标准输出。
2&>1可以拆成三部分2,&>,1,这三部分分别是:
2:前面执行程序的参数。
&>:将标准输出和标准错误输出都重定向。
1:重定向到文件1。
最后说为什么2>&1为什么要写到最后:
先贴一张图,在一个空目录中ls xxx必然是标准错误输出,如果先是2>&1,那么这个时候告诉SHELL把标准错误输出重定向到标准输出,这时候标准输出默认是到屏幕的,所以标准错误输出→标准输出→屏幕,就解释了为什么错误输出到了屏幕。再到后面的>log,把标准输出重定向到屏幕,这个时候标准输出已经没有任何东西了,所以log文件为空。
再贴一张图:
这个时候正常了,先把标准输出指到log文件,再把错误输出指到标准输出,错误输出的时候也就成了:错误输出→标准输出→log文件。
最后的最后,自己猜想了一种情况:
然而这种情况真的存在!也可以将标准错误输出和标准输出全部重定向到log文件,和上面的理解其实一致。
以上就是个人对2>&1的一些理解,欢迎批评指正。