【linux命令】Linux shell中 2>&1的含義解釋
技術標籤:【計算機組成原理&作業系統】
文章目錄
1. 首先了解下1和2在Linux中代表什麼
在Linux系統中0 1 2是一個檔案描述符:
上面的
操作符
可以理解成重定向符
1.1 重定向
什麼是重定向?我們先來看下不重定向,也就是預設輸出:
echo "hello"
預設的輸出就是輸出到螢幕上,那麼通過重定向符,我們可以改為輸入到指定的檔案中,常見的是日誌檔案之類的場景:
echo "hello" > t.log
這樣,我們就把螢幕的輸出重定向至t.log 檔案中,> 表示重定向符,t.log表示目標檔案
1.2 標準操作符
從前文的表格中看的出來,我們平時使用的:
echo "hello" > t.log
其實也可以寫成:
echo "hello" 1> t.log
使用 > 或 >> 時,預設為標準輸出 1 重定向, 所以 > file
就是 1> file
的省寫,1 與 > 之間不能有空格。數字 0, 1, 2 與它後面的操作符 > 或 < 等 總是一個整體.
1.3 關於2 >& 1的含義
2 代表錯誤標準輸出,1代表標準輸出。
我們先來看下標準輸出:
[[email protected]]# ls test
a.txt
ls命令也提供標準輸出,和echo一樣,會把結果輸出到螢幕上,test資料夾下有a.txt檔案。
我們可以把標準輸出重定向到指定的檔案中:
[[email protected]]$ ls test >succ.log `重定向到succ.log中 `
[[email protected]]$ cat succ.log `檢視succ.log`
a.txt ` 原本輸出到螢幕的內容果然也重定向到了指定的檔案中`
下面我們看下什麼是錯誤輸出:
[[email protected]]# ls xxx
ls: cannot access xxx: No such file or directory
我們ls命令檢視一個不存在的檔案xxx,命令執行後,會列印檔案不存在的提示資訊,這個資訊就是錯誤輸出,是作業系統產生的一種輸入型別,要和標準輸出進行區分開。
我們可以把標準錯誤輸出重定向到指定的檔案中:
[[email protected]]# ls xxx 2> err.log
[[email protected]]# cat err.log
ls: cannot access xxx: No such file or directory
1.3.1 把標準輸出和標準錯誤輸出分別指定到不同的檔案中
那麼我們有這樣的需求,當產生標準輸出時指定到succ.log中,當產生標準錯誤時輸出到error.log中,那麼語法如下:
[[email protected]]$ ls test >succ.log 2>err.log `test資料夾真實存在,產生標準日誌`
[[email protected]]$ cat succ.log
a.txt
[[email protected]]$ ls xxx >succ.log 2>err.log `xxx資料夾不存在,產生錯誤日誌`
[[email protected]]$ cat err.log
ls: cannot access xxx: No such file or directory `然在錯誤日誌被重定向到err.txt`
1.3.2 把標準輸出和標準錯誤輸出指定到同一個檔案中
基於1.3.1,我們有這樣的需求,當產生標準輸出時指定到my.log中,當產生標準錯誤時輸出也到my.log中,也就是說不管錯誤的輸出,還是標準的輸出,我都列印到一個檔案中,那麼語法如下:
[[email protected]]$ ls test >my.log 2>my.log
[[email protected]]$ ls xxx >my.log 2>my.log
那麼既然兩種輸出指定同一個檔案,有沒有優化的語法,可以簡單一些呢?如果檔名稱很長,那麼影響編寫的閱讀性!
有,“2 >& 1”閃亮登場,可以解決我們剛才的問題,代表將標準錯誤輸出重定向到標準輸出,什麼意思呢,很簡單,符號>&
是一個整體,不可分開 。:
[[email protected]]$ ls test >my.log 2& 1
[[email protected]]$ ls xxx >my.log 2>& 1
表示重定向,但是為了避免把1當成普通檔案1,通過&1
,表示指向一個物件1,物件1對應著前面的標準輸出!
為了提高可讀性,雖然還有一些簡寫方案,但建議儘量保留 2 &>
語法
參考:
《Linux shell中2>&1的含義解釋 (全網最全,看完就懂)》
《Linux 輸入輸出重定向, &>file, 2>&1, 1>&2 等》