Linux中數據流重定向的意思是將某個命令執行後應該要出現在屏幕上的數據傳輸到其他地方,例如文件或設備之類
一、stadardoutput與standarderror output
首先介紹一下命令執行過程的數據傳輸情況:
圖中的standard output和standard error output分別代表“標準輸出”和“標準錯誤輸出”。這兩個命令默認都是輸出到屏幕中來。
標準輸出:命令執行所回傳的正確的信息。
標準錯誤輸出:命令執行失敗後,所回傳的錯誤信息。
我們通過數據流重定向功能可以將這兩條信息分開,分別傳送到其他的文件或設備中去。
傳送使用的特殊字符是:
標準輸入(stdin):代碼爲0,使用<或<<;
標準輸出(stdout):代碼爲1,使用>或>>;
標準錯誤輸出(stderr):代碼爲2,使用2>或>>。
範例:
命令ll /:屏幕會顯示文件名信息。
而ll / > ~/rootfile:屏幕無任何信息。
ll ~/rootfile:可以發現有一個新文件被創建(文件不存在時),裏面的內容就是原本應該顯示在屏幕上的信息。
要注意的是,如果我再次使用重定向功能>:ll /home> ~/rootfile,將信息重定向到文件~/rootfile中,則原有的信息會被覆蓋(文件已存在時)。如果要將數據疊加而不是覆蓋,那使用符號>>就可以了。
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 //正確
第一行錯誤的原因是:兩條數據同時寫入一個文件,又沒有使用特殊寫法,此時兩條數據會交叉寫入該文件內,造成次序錯亂。最終產生的文件裏面數據排列會很混亂。
三、standardinput:<和<<
可以將原本由鍵盤輸入的數據由文件替代。
範例:
利用cat來創建一個文件的簡單流程
#cat > catfile
Testing
File
//然後在這裏按下[Ctrl]+d來離開
//接下來顯示catfile的內容
#cat catfile
Testing
File
用stdin替代鍵盤的輸入以創建新文件的簡單流程
cat > catfile< ~/.bashrc
可以發現catfile裏面的內容就是~/.bashrc裏面的內容。
而<<代表的是結束輸入的意思。
範例:我要用cat直接將輸入的信息輸出到catfile中,而且由鍵盤輸入eof結束。可以這樣做:
cat > catfile<< “eof”
> This is atest
> OK,I willstop.
> eof
這樣就不必使用Ctrl+d來結束。