next up previous contents
Next: 管線命令 (pipe) Up: 正規表示法與管線處理 Previous: 延伸正規表示法   Contents

資料流重導向

  • 為何要使用命令輸出重導向?
    1. 儲存螢幕輸出的資訊;
    2. 背景執行中的程式,不希望他干擾螢幕正常的輸出結果時;
    3. 儲存系統例行命令(例如寫在 /etc/crontab 中的檔案)的執行結果;
    4. 將已知的可能錯誤訊息丟掉『 2> /dev/null 』;
    5. 錯誤訊息與正確訊息需要分別輸出時。
  • 指令執行過程之資料傳輸

    \begin{picture}(150,37)
\put(0,23){\dashbox{1}(20,12){file}}
\put(55,23){\dashbo...
...\{指令列模式\} 讀取、儲存檔案 其他額外功能\}\}\}
\end{picture}
    1. 執行cat /etc/issue,出現standard output。
      [root@kvm5 ~]# cat /etc/issue
      CentOS Linux release 6.0 (Final)
      Kernel \r on an \m
      
    2. 執行cat /tmp/issue,出現standard error。
      [root@kvm5 ~]# cat /tmp/issue
      cat: /tmp/issue: No such file or directory
      
    3. 傳送指令
      1. 標準輸入(stdin) :代碼為 0 ,使用 < 或 <<
      2. 標準輸出(stdout):代碼為 1 ,使用 > 或 >>
      3. 標準錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>>
        >, 1>   標準輸出至檔案,該檔案被覆蓋或建立。
        >>, 1>>   標準輸出至檔案,該檔案被建立或累加。
      command 2> 裝置或檔案 錯誤輸出至檔案,該檔案被覆蓋或建立。
        2>>   錯誤輸出至檔案,該檔案被建立或累加。
        <   輸入
        <<   結束的輸入字元
    4. 檔案的建立方式
      [root@kvm5 ~]# cat /etc/issue > /tmp/issue
      [root@kvm5 ~]# cat /tmp/issue
      CentOS Linux release 6.0 (Final)
      Kernel \r on an \m
      
    5. 下達 >>>
      [root@kvm5 ~]# cat /etc/issue >> /tmp/issue
      [root@kvm5 ~]# cat /tmp/issue
      CentOS Linux release 6.0 (Final)
      Kernel \r on an \m
      
      CentOS Linux release 6.0 (Final)
      Kernel \r on an \m
      
    6. 下達 2>
      [root@kvm5 ~]# cat /tmp/dywang
      cat: /tmp/dywang: No such file or directory
      [root@kvm5 ~]# cat /tmp/dywang 2> cat-error
      [root@kvm5 ~]# cat cat-error 
      cat: /tmp/dywang: No such file or directory
      
      [root@kvm5 ~]# cat /tmp/dywang 2> /dev/null
      
    7. 下達 2>&1:標準輸出與標準錯誤輸出同時寫入同一個檔案
      [root@kvm5 ~]# cat /etc/issue /tmp/dywang
      CentOS Linux release 6.0 (Final)
      Kernel \r on an \m
      
      cat: /tmp/dywang: No such file or directory
      [root@kvm5 ~]# cat /etc/issue /tmp/dywang 1> list 2>list
      [root@kvm5 ~]# cat list
      cat: /tmp/dywang: No such file or directory
      n an \m
      
      [root@kvm5 ~]# cat /etc/issue /tmp/dywang 2> list 1>list
      [root@kvm5 ~]# cat list
      cat: /tmp/dywang: No such file or directory
      n an \m
      
      [root@kvm5 ~]# cat /etc/issue /tmp/dywang 1> list 2>&1
      [root@kvm5 ~]# cat list
      CentOS Linux release 6.0 (Final)
      Kernel \r on an \m
      
      cat: /tmp/dywang: No such file or directory
      
    8. 將螢幕輸入結果存入檔案
      [root@kvm5 ~]# cat > list << EOF
      > first
      > second
      > EOF
      [root@kvm5 ~]# cat list
      first
      second
      

  • 命令執行的判斷依據
    1. 指令間以分號( ; )隔開:連續執行指令。
      [root@kvm5 ~]# sync; shutdown -h now
      
    2. 指令間以 && 隔開:前面指令執行結果正確,就接著執行後續的指令,否則就略過。
      [root@kvm5 ~]# ls /tmp && touch /tmp/testingagin 
      ## 目錄/tmp存在,所以/tmp/testingagin會被建立。
      [root@kvm5 ~]# ls /vbird && touch /vbird/test
      ## 目錄/vbird不存在,所以touch /vbird/test不會被執行。
      
    3. 指令間以 || 隔開:前一個指令有錯誤時,後面的指令才被執行。
      [root@kvm5 ~]# ls /tmp/vbirding || touch /tmp/vbirding
      
    4. 例題:以 ls 測試 /tmp/csie 是否存在?若存在則顯示 "exist" ,若不存在,則顯示 "not exist"。
      ls /tmp/csie && echo "exist" || echo "not exist"   <== 正確
      ls /tmp/csie || echo "not exist" && echo "exist"   <== 錯誤
      
    5. 習題:以 ls 測試目錄 /tmp/s9427??? 是否存在,若存在則進入目錄,若不存在,則建立目錄。



2015-04-13