A.首先了解下1和2在Linux中代表什么
在Linux系統(tǒng)中0 1 2是一個文件描述符
名稱代碼操作符Linux 下文件描述符(Debian 為例)
從上表看的出來送漠,我們平時使用的
echo "hello" > t.log
(將“hello"標準輸出到 t.log 文件)
其實也可以寫成
echo "hello" 1> t.log
B.關于2>&1的含義
(關于輸入/輸出重定向本文就不細說了启具,不懂的可以參考這里冲九,主要是要了解> < << >> <& >& 這6個符號的使用)
1、含義:將標準錯誤輸出重定向到標準輸出
2酱鸭、符號>&是一個整體,不可分開,分開后就不是上述含義了炼蹦。
比如有些人可能會這么想:2是標準錯誤輸入,1是標準輸出狸剃,>是重定向符號掐隐,那么"將標準錯誤輸出重定向到標準輸出"是不是就應該寫成"2>1"就行了?是這樣嗎钞馁?
如果是嘗試過虑省,你就知道2>1的寫法其實是將標準錯誤輸出重定向到名為"1"的文件里去了
3、寫成2&>1也是不可以的
C.為什么2>&1要放在后面
考慮如下一條shell命令
ls / /aabb >log 2>&1 &
為什么2>&1一定要寫到>log后面僧凰,才表示標準錯誤輸出和標準輸出都定向到log中探颈?
我們不妨把1和2都理解是一個指針,然后來看上面的語句就是這樣的:
本來1----->屏幕 (1指向屏幕)
執(zhí)行>log后, 1----->log (1指向log)
執(zhí)行2>&1后训措, 2----->1 (2指向1伪节,而1指向log,因此2也指向了log)
最后一個&表示把條命令放到后臺執(zhí)行
我來舉一個簡單的例子,看看如何使用 & 號將下面這個命令放到后臺運行:
cp -R original/dir/ backup/dir/
這個命令的目的是將 original/dir/ 的內(nèi)容遞歸地復制到 backup/dir/ 中绩鸣。雖然看起來很簡單怀大,但是如果原目錄里面的文件太大,在執(zhí)行過程中終端就會一直被卡住呀闻。
所以化借,可以在命令的末尾加上一個&號,將這個任務放到后臺去執(zhí)行:
cp -R original/dir/ backup/dir/ &
任務被放到后臺執(zhí)行之后捡多,就可以立即繼續(xù)在同一個終端上工作了蓖康,甚至關閉終端也不影響這個任務的正常執(zhí)行。
再來分析下
ls / /aabb 2>&1 >log &
本來1----->屏幕 (1指向屏幕)
執(zhí)行2>&1后局服, 2----->1 (2指向1钓瞭,而1指向屏幕,因此2也指向了屏幕)
執(zhí)行>log后, 1----->log (1指向log淫奔,2還是指向屏幕)
所以這就不是我們想要的結(jié)果山涡。
簡單做個試驗測試下上面的想法:
代碼如下:
ls / /aabb
顯示結(jié)果:
ls: cannot access /aabb: No such file or directory
/:
123 boot etc lib lp opt run sys var
aaa czw1801 hello sxt lib64 media proc sbin tmp
bin dev home lost+found mnt root srv usr
分別有 錯誤輸出 和 標準輸出
運行下面指令:
ls / /aabb 2>&1 >log &
正確應為:ls / /aabb >log 2>&1 &
按Enter退回終端,cat log 查閱
會看到只輸出了 ls / 的內(nèi)容,未輸出 / aabb的內(nèi)容
D.每次都寫">log 2>&1"太麻煩鸭丛,能簡寫嗎竞穷?
有以下兩種簡寫方式
&>log
>&log
比如上面小節(jié)中的寫法就可以簡寫為:
ls / /aabb &>log &
上面兩種方式都和">log 2>&1"一個語義。
那么 上面兩種方式中&>和>&有區(qū)別嗎鳞溉?
語義上是沒有任何區(qū)別的瘾带,但是第一中方式是最佳選擇,一般使用第一種