1. 程式人生 > 其它 >【linux命令】Linux shell中 2>&1的含義解釋

【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 等》