Linux中資料流重新導向的意思是將某個命令執行後應該要出現在螢幕上的資料轉送到其他地方,例如檔案或裝置之類。
一、stadard output與standard error output
首先介紹一下命令執行過程的資料轉送情況:
圖中的standard output和standard error output分別代表“標準輸出”和“標準錯誤輸出”。這兩個命令預設都是輸出到螢幕中來。
標準輸出:命令執行所回傳的正確的資訊。
標準錯誤輸出:命令執行失敗後,所回傳的錯誤資訊。
我們通過資料流重新導向功能可以將這兩條資訊分開,分別傳送到其他的檔案或裝置中去。
傳送使用的特殊字元是:
標準輸入(stdin):代碼為0,使用<或<<;
標準輸出(stdout):代碼為1,使用>或>>;
標準錯誤輸出(stderr):代碼為2,使用2>或>>。
範例:
命令ll /:螢幕會顯示檔案名稱資訊。
而ll / > /tmp/fileinfo:螢幕無任何資訊。
ll /tmp/fileinfo:可以發現有一個新檔案被建立(檔案不存在時),裡面的內容就是原本應該顯示在螢幕上的資訊。
要注意的是,如果我再次使用重新導向功能>:ll /home > /tmp/fileinfo,將資訊重新導向到檔案/tmp/info中,則原有的資訊會被覆蓋(檔案已存在時)。如果要將資料疊加而不是覆蓋,那使用符號>>就可以了。
stdout代碼為1,當我們僅用>和>>預設就是1>,1>>。而當我們要重新導向standard error output資料時,用2>和2>>即可。其意義和stdout一樣。
下面再來看一個範例:
find /home –name .bashrc> list
可以發現list裡面儲存了正確的資訊,但是錯誤的資訊還是顯示在了螢幕上面。那麼如果要將正確資訊和錯誤資訊分別存入不同的檔案呢,應該怎麼辦?
find /home –name.bsdhrc > list_right 2> list_error
這樣就可以了。
二、/dev/null垃圾黑洞裝置與特殊寫法
此功能適用於我們知道有錯誤資訊要發生,我們不想將其儲存或者顯示出來而將其忽略。
範例:
find /home –name.bashrc 2> /dev/null
這樣螢幕上就只有正確的資料,錯誤資訊被忽略了。
如果我們想將正確資料和錯誤資料寫入同一個檔案呢?這個時候就要適用特殊寫法了。
範例:將命令的資料全部寫入list檔案中。
find /home –name.bashrc >list 2> list //錯誤
find /home –name.bashrc >list 2> &1 //正確:推薦
find /home –name.bashrc &>list //正確
第一行錯誤的原因是:兩條資料同時寫入一個檔案,又沒有使用特殊寫法,此時兩條資料會交叉寫入該檔案內,造成次序錯亂。最終產生的檔案裡面資料排列會很混亂。
三、standard input:<和<<
可以將原本由鍵盤輸入的資料由檔案替代。
範例:
cat > catfile< ~/.bashrc
可以發現catfile裡面的內容就是~/.bashrc裡面的內容。
而<<代表的是結束輸入的意思。
範例:我要用cat直接將輸入的資訊輸出到catfile中,而且由鍵盤輸入eof結束。可以這樣做:
cat > catfile<< “eof”
> This is atest
> OK,I willstop.
> eof
這樣就不必使用Ctrl+d來結束。