Linux學習資料-命令重導向

命令重導向
基本上,這個子題是 bash 至關重要的觀念,這裏可得花點心思才行呦!
什麼是『重導向, redirect ?』:簡單的說,就是將你目前的所得資料轉到其它地方去就是了!例如咱們經常使用的,將目前的屏幕輸出數據轉到檔案中去,就能夠這麼寫:『ls -l / > test 』,那個大於的符號『 > 』就是將輸出結果導向到 test 這個檔案中的意思囉!這個時候:
若是你執行『 ls -l / 』而已的話,屏幕會將根目錄的檔案與目錄都列出在屏幕上;
可是當使用 > 導向到 test 這個檔案中時,則屏幕不會顯示任何訊息,可是會將剛剛你執行的結果輸出到 test 這個檔案中。
因此囉,你只要『 vi test 』一下,就會知道 test 這個檔案中記錄了剛剛咱們執行的數據結果囉!不過,這裏須要特別留意的是,當你使用 > 符號將數據由屏幕導向到檔案中時,則:
該檔案(就是 test )若不存在,系統會自動的將他創建起來,可是,
當這個檔案存在的時候,那麼系統就會先將這個檔案內容清空,而後再將數據寫入!
也就是若以 > 輸出到一個既存盤案中,呵呵,那個檔案就會被覆蓋掉囉!
除了這個 > 的符號以外,在 bash 命令執行的過程當中,主要有三種輸出入的情況,分別是:
標準輸入;代碼爲 0 ;或稱爲 stdin ;使用的方式爲 <
標準輸出:代碼爲 1 ;或稱爲 stdout;使用的方式爲 1>
錯誤輸出:代碼爲 2 ;或稱爲 stderr;使用的方式爲 2>
基本的指令書寫方式爲:
  指令 1>
1>>
2>
2>>
< 裝置或檔案bash

左邊必定是指令,至於右邊則多是裝置或者是檔案!注意了!那個 1> 與 2> 之間並無空格符!而相關的使用說明能夠舉例以下:
  [test @test test]# ls -al >  list.txt 
將顯示的結果輸出到 list.txt 檔案中,若該檔案以存在則予以取代!
[test @test test]# ls -al >> list.txt 
將顯示的結果累加到 list.txt 檔案中,該檔案爲累加的,舊數據保留!
[test @test test]# ls -al 1> list.txt 2> list.err 
將顯示的數據,正確的輸出到 list.txt 錯誤的數據輸出到 list.err
[test @test test]# ls -al 1> list.txt 2>&1 
將顯示的數據,不論正確或錯誤均輸出到 list.txt 當中!
[test @test test]# ls -al 1> list.txt 2> /dev/null
將顯示的數據,正確的輸出到 list.txt 錯誤的數據則予以丟棄!
注意!錯誤與正確檔案輸出到同一個檔案中,則必須以上面的方法來寫!
不能寫成其它格式!.net


這個觀念至關的重要,尤爲是在 /etc/crontab 當中執行的時候,若是咱們已經知道錯誤的訊息爲什麼,又不想要讓錯誤的訊息一直填滿 root 的信箱,就必須以 2> 搭配 /dev/null 這個垃圾桶黑洞裝置,來將數據丟棄!這個至關的重要!crontab

這裏咱們來講明一下命令重導向裏面幾個經常使用的符號與裝置:
<  :由 < 的右邊讀入參數檔案;
>  :將本來由屏幕輸出的正確數據輸出到 > 右邊的 file ( 文件名稱 ) 或 device ( 裝置,如 printer )去;
>> :將本來由屏幕輸出的正確數據輸出到 >> 右邊,與 > 不一樣的是,該檔案將不會被覆蓋,而新的數據將以『增長的方式』增長到該檔案的最後面;
2> :將本來應該由屏幕輸出的錯誤數據輸出到 2> 的右邊去。
/dev/null :能夠說成是黑洞裝置!
好了,對於『 > , >> 』這兩個東西有必定的概念以後,咱們來深刻的談一談『命令輸出重導向』的觀念吧!如前所述,基本上, Linux 執行的結果中,能夠約略的分紅『正確輸出』與『錯誤輸出』兩種方式。例如,當你以通常身份執行 find 這個指令時,例如執行『 find / -name testing 』時,因爲你是通常身份,又有些數據夾是不容許通常身份者進入的,因此囉,當你使用 find 時,就會有錯誤訊息發生了!但同時若是有 testing 這個檔案在你能夠進入的資料夾當中,那麼屏幕也會輸出到給你看!所以,就具備正確的與錯誤的輸出兩種囉!(分別稱爲 Stdout 與 Stderror)例以下面爲執行結果:裏面的『 find: /home/root: Permission denied 』就告訴你該數據夾你沒有權限進入,這就是錯誤的輸出了,那麼『 /home/test/tseting 』就是正確的輸出了!
  [test @test test]# find / -name testing
find: /home/test1: Permission denied    <==這是錯誤的輸出
find: /home/root: Permission denied       <==這是錯誤的輸出
find: /home/masda: Permission denied      <==這是錯誤的輸出
/home/test/testing                        <==這是『正確』的輸出
[test @test test]# ip

好了,那麼假如咱們想要將數據輸出到 list 這個檔案中呢?執行『 find / -name testing > list 』會有什麼結果?呵呵,你會發現 list 裏面存了剛剛那個『正確』的輸出數據,至於屏幕上仍是會有錯誤的訊息出現呢!傷腦筋!若是想要將正確的與錯誤的數據分別存入不一樣的檔案中須要怎麼作?!呵呵!其實在數據的重導向方面,正確的寫法應該是『 1> 』與『 2> 』纔對!可是若是隻有 > 則預設是以 1> 來進行數據的!那個 1> 是輸出正確數據, 2> 則是錯誤數據輸出項目。也就是說:get

1> :是將正確的數據輸出到指定的地方去
2> :是將錯誤的數據輸出到指定的地方去
好了,那麼上面的例子中,咱們如何將數據輸出到不一樣的地方去呢?能夠這麼寫:
  [test @test test]# find / -name testing 1> list_right 2> list_errorio

這樣一來,剛剛執行的結果中,有 Permission 的那幾行錯誤信息都會跑到 list_error 這個檔案中,至於正確的輸出數據則會存到 list_right 這個檔案中囉!這樣能夠了解了嗎?若是有點混亂的話,去休息一下再來看看吧!!class

再來,若是我只要正確的數據,錯誤的信息我不要了呢?呵呵,這個時候 /dev/null 這個垃圾桶就很重要了!/dev/null 是什麼呢?基本上,那就有點像是一個『黑洞』的垃圾桶功能!當你輸入的任何東西導向到這個虛擬的垃圾桶裝置時,『他就會憑空消失不見了~~』,這個東西有用的很!例如上面的例子中,咱們能夠這麼作,來將錯誤的信息丟掉!
  [test @test test]# find / -name testing 1> list_right 2> /dev/nulltest

很神奇呦! error message 就會『不見了!』呵呵!真高興!另外,若是我要將數據都寫到同一個檔案中呢?這個時候寫法須要用到特殊寫法,請注意底下的寫法呦!
  [test @test test]# find / -name testing 1> list 2> list<==錯誤寫法
[test @test tset]# find / -name testing 1> list 2>&1   <==正確寫法file


請特別留意這一點呢!同時寫入同一個檔案須要使用 2>&1 纔對呦!權限

OK!瞭解了 >, 2>, >> 與 /dev/null 以後,那麼那個 < 又是什麼呀!?呵呵!以最簡單的說法來講,那就是『將本來須要由鍵盤輸入的數據,經由檔案來讀入』的意思,最明顯的例子就是 mail 這個東西了!咱們以 root 的身份來寄信給 root 好了,能夠這樣作:
  1. 徹底由鍵盤輸入數據:
[root @test test]# mail -s "test" root <== -s 表示標題, root 爲收件者
I am root! <==如下的數據都是由鍵盤輸入的
That's OK
.       <==要結束鍵盤的輸入時,須要在一行的最前面加上 . 便可!
CC.     <==是否須要有密件副本?不須要的話,直接按下 Enter !
EOF     <==表示送出的提示字符而已!
2. 由檔案代替輸入
[test @test tset]# mail -s "test" root < /root/.bashrc <==將 .bashrc 內容寄給 root !
 

頗有趣吧! ^_^ 這樣就能夠將信寄出去囉!因此說,熟悉命令重導像的話,對您但是至關的有幫助的呦!

好了,那麼爲什麼要使用命令輸出重導向呢?這個問題必定會困擾你一下下的,若是你歷來都沒有寫過 script 的話!好了,咱們來講一說吧!當屏幕輸出的信息很重要,並且咱們須要將他存下來的時候; 背景執行中的程序,不但願他干擾屏幕正常的輸出結果時; 一些系統的例行命令(例如寫在 /etc/crontab 中的檔案)的執行結果,但願他能夠存下來時; 一些執行命令,咱們已經知道他可能的錯誤訊息,因此想以『 2> /dev/null 』將他丟掉時; 錯誤訊息與正確訊息須要分別輸出時。 固然還有不少不少的功能的,最簡單的就是網友們經常問到的:『爲什麼個人 root 都會收到系統 crontab 寄來的錯誤訊息呢』這個咚咚是常見的錯誤,而若是咱們已經知道這個錯誤訊息是能夠忽略的時候,嗯!『 2> errorfile 』這個功能就很重要了吧!瞭解了嗎??

相關文章
相關標籤/搜索