ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 命令重導向

命令重導向

原创 Linux操作系统 作者:wwd_wang 时间:2009-09-22 09:02:30 0 删除 编辑
命令重導向
    基本上,這個子題是 bash 相當重要的觀念,這裡可得花點心思才行呦!
    • 什麼是『重導向, redirect ?』:簡單的說,就是將你目前的所得資料轉到其他地方去就是了!例如我們常用的,將目前的螢幕輸出資料轉到檔案中去,就可以這麼寫:『ls -l / > test 』,那個大於的符號『 > 』就是將輸出結果導向到 test 這個檔案中的意思囉!這個時候:
      • 如果你執行『 ls -l / 』而已的話,螢幕會將根目錄的檔案與目錄都列出在螢幕上;
      • 但是當使用 > 導向到 test 這個檔案中時,則螢幕不會顯示任何訊息,但是會將剛剛你執行的結果輸出到 test 這個檔案中。
      所以囉,你只要『 vi test 』一下,就會知道 test 這個檔案中記錄了剛剛我們執行的資料結果囉!不過,這裡需要特別留意的是,當你使用 > 符號將資料由螢幕導向到檔案中時,則:
      • 該檔案(就是 test )若不存在,系統會自動的將他建立起來,但是,
      • 當這個檔案存在的時候,那麼系統就會先將這個檔案內容清空,然後再將資料寫入!
      • 也就是若以 > 輸出到一個既存檔案中,呵呵,那個檔案就會被覆蓋掉囉!
    除了這個 > 的符號之外,在 bash 命令執行的過程中,主要有三種輸出入的狀況,分別是:
    1. 標準輸入;代碼為 0 ;或稱為 stdin ;使用的方式為 <
    2. 標準輸出:代碼為 1 ;或稱為 stdout;使用的方式為 1>
    3. 錯誤輸出:代碼為 2 ;或稱為 stderr;使用的方式為 2>
    基本的指令書寫方式為:
     
    指令 1>
    1>>
    2>
    2>>
    <
    裝置或檔案

    左邊一定是指令,至於右邊則可能是裝置或者是檔案!注意了!那個 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 錯誤的資料則予以丟棄!
    注意!錯誤與正確檔案輸出到同一個檔案中,則必須以上面的方法來寫!
    不能寫成其他格式!

    這個觀念相當的重要,尤其是在 /etc/crontab 當中執行的時候,如果我們已經知道錯誤的訊息為何,又不想要讓錯誤的訊息一直填滿 root 的信箱,就必須以 2> 搭配 /dev/null 這個垃圾桶黑洞裝置,來將資料丟棄!這個相當的重要!

    這裡我們來說明一下命令重導向裡面幾個常用的符號與裝置:
    • <  :由 < 的右邊讀入參數檔案;
    • >  :將原本由螢幕輸出的正確資料輸出到 > 右邊的 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]# 

好了,那麼假如我們想要將資料輸出到 list 這個檔案中呢?執行『 find / -name testing > list 』會有什麼結果?呵呵,你會發現 list 裡面存了剛剛那個『正確』的輸出資料,至於螢幕上還是會有錯誤的訊息出現呢!傷腦筋!如果想要將正確的與錯誤的資料分別存入不同的檔案中需要怎麼做?!呵呵!其實在資料的重導向方面,正確的寫法應該是『 1> 』與『 2> 』才對!但是如果只有 > 則預設是以 1> 來進行資料的!那個 1> 是輸出正確資料, 2> 則是錯誤資料輸出項目。也就是說:

  • 1> :是將正確的資料輸出到指定的地方去
  • 2> :是將錯誤的資料輸出到指定的地方去
好了,那麼上面的例子中,我們如何將資料輸出到不同的地方去呢?可以這麼寫:
 
[test @test test]# find / -name testing 1> list_right 2> list_error

這樣一來,剛剛執行的結果中,有 Permission 的那幾行錯誤資訊都會跑到 list_error 這個檔案中,至於正確的輸出資料則會存到 list_right 這個檔案中囉!這樣可以瞭解了嗎?如果有點混亂的話,去休息一下再來看看吧!!

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

    很神奇呦! error message 就會『不見了!』呵呵!真高興!另外,如果我要將資料都寫到同一個檔案中呢?這個時候寫法需要用到特殊寫法,請注意底下的寫法呦!
     

    [test @test test]# find / -name testing 1> list 2> list <==錯誤寫法
    [test @test tset]# find / -name testing 1> list 2>&1    <==正確寫法

    請特別留意這一點呢!同時寫入同一個檔案需要使用 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 』這個功能就很重要了吧!瞭解了嗎??

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12137615/viewspace-615225/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 管線命令 ( pipe )
请登录后发表评论 登录
全部评论

注册时间:2008-05-08

  • 博文量
    236
  • 访问量
    233990