Linux的標準輸出(stdout)與標準錯誤的重定向(stderr)

我相信大家不論在編程語言,python腳本,shell腳本編寫,到處都能見到這兩個語句吧~~,一直是模模糊糊,懵懵懂懂。我今天就上網瀏覽了一番,特來做一下筆記。

標準輸出(stdout)指的就是在命令行裏,每次你輸入指令後,終端上打印出來的那些話,那些反饋。標準錯誤(stderr)跟標準輸出差不多,只不過是程序出錯時反饋的內容。標準輸入(stdin)就是程序指示讓你輸入用戶名密碼之類的這種,這裏不多談輸入。比如python中的print('helloworld')、c++中的cout << "helloworld" << endl;shell腳本中的echo語句,都是標準輸出。

問題是,我們很常用的會讓一些腳本自己在後臺24/7運行,這種時候腳本的輸出內容到屏幕上(標準輸出)也沒什麼意義,我們看不到也保存不了。所以最好讓它把反饋的內容全部直接寫如一個文件裏,我們叫日誌文件,其實就是個txt。然後我們自己可以查看日誌來看到底發生了什麼。

這種把顯示到屏幕的程序反饋,變成存到文件裏的動作,我們叫做輸出重定向(stdout redirection)

在命令行裏,我們可以用符號直接把程序輸出轉向到某個文件或某個程序,如下:

$ git push > log.txt

然後,理論上我們平常git push後的反饋就會保存到log.txt這個文件裏了,且屏幕上不會顯示任何東西。
但其實這個還是有問題的,因爲事後我們發現有一些存到了log.txt,還有一些話漏網顯示到了屏幕上,沒存進去文檔裏。
其實原來這些顯示到屏幕上的反饋有些是stdout有些是stderr,我們用>>>符號重定向,只是默認重定向stdout,沒有重定向stderr,所以會有漏網之魚。對此,我們需要了解下這個符號的設定,和怎麼把stderr也包括進來,一起重定向過去。

重定向符號和語句

稍微會一點點linux命令的,都會用到cmd > file這樣的語句,把命令反饋的輸出到一個文件裏。當然還有cmd >> file,這是把內容追加到文件裏,而不是重新擦寫一遍。>這個符號可以念redirect to
實際上,重定向有很多種設置和配合,讓你可以分別重定向標準輸出和標準錯誤,或者一起重定向,然後還可以選擇是隻輸出到文件裏還是同時輸出到顯示屏上和文件裏。
這裏我們就要了解一下設置重定向的基本語法了,如下:

  • > 以擦寫的模式重定向至...
  • >> 以追加的模式重定向至...
  • 1 代表stdout標準輸出
  • 2 代表stderr標準錯誤

所以,cmd > file實際上是縮略了的寫法,理解起來,應該是cmd &1> file,也就是隻把標準輸出轉出去(重定向到文件)。
那麼同理,只把標準錯誤轉出去,就應該是cmd &2> file


其中,&符號沒任何實際意義,只是以至區分,代表後面的符號是要設置重定向用的,而不是某個文件的名字。文章末尾單獨補充下&符號的作用

 

2>&1

每次查重定向問題時,我們總會看到這句話,一般人很難理解這到底是在幹嘛。我一開始以爲是2要大於1什麼的,真是笑話。
其實這是個重定向的設置,設置讓2重定向到1,也就是讓stderr標準錯誤重定向到stdout標準輸出,然後兩個並在一起再重定向。其中&沒什麼意思只是區分開來1是代表stdout而不是代表一個文件名。
用起來的格式是:cmd > file 2>&1
爲什麼設置要放在後面呢?
具體暫時還不知道,只知道是這麼用,放在前面還不行只能放在後面。

比如:

$ git push > log.txt 2>&1

那麼這時候,屏幕上就真的不會顯示任何東西了,標準輸出、標準錯誤,全部都會存到log.txt文件裏了。

 

重定向符號>與&號:

1>&2 正確返回值傳遞給2輸出通道 &2表示2輸出通道,如果此處錯寫成 1>2, 就表示把1輸出重定向到文件2中.。
2>&1 錯誤返回值傳遞給1輸出通道, 同樣&1表示1輸出通道. 而不是一個文件。

 

 >是重定向符,就是把前面輸出的內容重定向到後面指定的位置

echo "一些內容" > filename.txt

>前是可以加數字來說明把什麼內容重定向到文件中,默認是把標準輸出重定向到文件中,所以下面這個例子和上面那個是一樣的(例2):

 echo "一些內容" 1> filename.txt

 

& 是一個描述符,如果1或2前不加&,會被當成一個普通文件。

1>&2 意思是把標準輸出重定向到標準錯誤.

2>&1 意思是把標準錯誤輸出重定向到標準輸出。

&>filename 意思是把標準輸出和標準錯誤輸出都重定向到文件filename

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章