Related Posts Plugin for WordPress, Blogger...

標準輸入及輸出 Standard Input and Output

以下為常用數值 (實際上不只此三個數值而是 0 ~ 10)。(請尊重 Weithenn 的辛勞!!)
  • 0: Standard input (STDIN) 預設為鍵盤輸入值。
  • 1: Standard output (STDOUT) 預設為終端機螢幕顯示。
  • 2: Standard error (STDERR) 預設為終端機螢幕顯示。

重新導入符號

以下為常用重新導入符號 (Redirecting Output)。
  • >: Overwrite (預設等於 1>)。
  • &>: Redirect all output (1 ~ 10)。
  • 2>&1: Redirect STDERR to STDOUT。
  • >>: Append。
  • |: Pipe。(請尊重 Weithenn 的辛勞!!)
  • <: Redirect-Input。
  • <<: End-Word。

例如下列操作中輸入的指令 ls /tmp 即為 Standard Input (0) 而查詢結果即為 Standard Output (1)。
#ls /root    //Standard Input (0)
  anaconda-ks.cfg  install.log  install.log.syslog  //Standard Output(1)

接下來請使用一般使用者帳號 weithenn 來登入系統進行練習,下列操作中即為同時產生了 Standard Input、Standard Output、Standard Error 的結果,跟著進行如下操作完成後相信您會更了解何為 Standard Input、Standard Output、Standard Error。
$find /etc -name passwd                 //Standard Input (0)
  /etc/passwd                              //Standard Output (1)
  /etc/pam.d/passwd                        //Standard Output (1)
  find: `/etc/audit': Permission denied    //以下都是 Standard Error (2)
  find: `/etc/cups/ssl': Permission denied                          
  find: `/etc/ntp/crypto': Permission denied
  find: `/etc/lvm': Permission denied
  find: `/etc/sssd': Permission denied
  find: `/etc/audisp': Permission denied
  find: `/etc/pki/CA/private': Permission denied
  find: `/etc/selinux/targeted/modules/active': Permission denied
  find: `/etc/polkit-1/localauthority': Permission denied
  find: `/etc/dhcp': Permission denied

您也可配合使用 Redirect 符號將您想要得到結果輸出至指定檔案中,如下操作中將 find 搜尋結果 Redirect 至檔案 find.out 中而使用的 Redirect 符號為 > (等於 1>)也就是將 Standard output (1) 結果輸出至檔案 find.out 中,所以您可看到指定執行後畫面只輸出 Standard Error (2) 的結果。
$find /etc -name passwd > find.out       //Standard Input (0)
  find: `/etc/audit': Permission denied
  find: `/etc/cups/ssl': Permission denied
  find: `/etc/ntp/crypto': Permission denied
  ...略...
 $cat find.out                              //查看 find.out 檔案內容
  /etc/passwd                                //剛才指令 Standard Output (1) 的結果
  /etc/pam.d/passwd  

所以若您將 Redirect 符號改變為 2> 也就是將輸出結果為 Standard Error (2) 內容導入至檔案 find.out 中,那麼螢幕上顯示則僅剩 Standard Output (1)。
$find /etc -name passwd 2> find.out     //Standard Input (0)
  /etc/pam.d/passwd                         //Standard Output (1)
  /etc/passwd
$cat find.out                             //查看 find.out 檔案內容
  find: `/etc/audit': Permission denied     //剛才 Standard Error (2) 的結果
  find: `/etc/cups/ssl': Permission denied
  find: `/etc/ntp/crypto': Permission denied
  ...略...

當然您也可利用多個 Argument 來達成將 Standard Output (1) 及 Standard Error (2) 結果導至不同的檔案。(請尊重 Weithenn 的辛勞!!)
$find /etc -name passwd > find.out 2> find.err
$cat find.out
  /etc/passwd
  /etc/pam.d/passwd
$cat find.err
  find: `/etc/audit': Permission denied
  find: `/etc/cups/ssl': Permission denied
  find: `/etc/ntp/crypto': Permission denied
  ...略...

若您不想寫那麼多的話您可利用 2>&1 來達成,不過在使用上要注意其位置,否則可能輸出的結果不是您想要的結果,如下為將 find 指令執行結果 Standard Output (1) 輸出至檔案 find.out 中在透過 2>&1 符號 Redirect STDERR to STDOUT 所以在 find.out 中內容為 Standard Output (1) 及 Standard Error (2)。
$find /etc -name passwd > find.out 2>&1
$cat find.out
  /etc/passwd
  /etc/pam.d/passwd
  find: `/etc/audit': Permission denied
  find: `/etc/cups/ssl': Permission denied
  find: `/etc/ntp/crypto': Permission denied
  ...略...

將 find 指令執行結果 Standard Error (2) 顯示至終端 (螢幕) 而將 Standard Output (1) 結果 Redirect 至檔案 find.out 中。(請尊重 Weithenn 的辛勞!!)
$find /etc -name passwd 2>&1 > find.out
  find: `/etc/audit': Permission denied
  find: `/etc/cups/ssl': Permission denied
  find: `/etc/ntp/crypto': Permission denied
  ...略...
$cat find.out
  /etc/passwd
  /etc/pam.d/passwd


管理 (Piping)

我們可利用管線 (|) Pipe 來使上個指令的輸出結果變成為下個指令的輸入,如下指令配合 Pipe 應該可輕鬆顯示目前網路卡上的 IP Address。
#ls -l /dev |grep std
  lrwxrwxrwx. 1 root root    15 Oct  7 17:41 stderr -> /proc/self/fd/2
  lrwxrwxrwx. 1 root root    15 Oct  7 17:41 stdin -> /proc/self/fd/0
  lrwxrwxrwx. 1 root root    15 Oct  7 17:41 stdout -> /proc/self/fd/1

也可使用 Pipe 來達成將 Mail 內容快速輸入的效果,例如使用指令來寄送 Mail:

方式一、將檔案內容直接轉換為郵件內容
#mail -s "test1" weithenn < /etc/s*/n*s/ifcfg-eth0
方式二、透過 echo 及 Pipe 將簡單字串輸入至郵件內容中
#echo "Test Mail 2" | mail -s "test2" weithenn
方式三、利用互動模式手動輸入郵件內容
#mail -s "test3" weithenn  //輸入後按下 Enter
  Test Mail 3                  //郵件內容
  .                            //表示郵件內容結束
  EOT

接著可以使用指令 mail 讀取系統郵件,常用操作如下:(請尊重 Weithenn 的辛勞!!)
$mail
  Heirloom Mail version 12.4 7/29/08.  Type ? for help.
  "/var/spool/mail/weithenn": 3 messages 1 new 2 unread
     1 root                  Tue Oct 11 10:31  25/684   "test1"
  U  2 root                  Tue Oct 11 10:32  19/574   "test2"
 >N  3 root                  Tue Oct 11 10:32  18/564   "test3"
 >number: 讀取指定郵件 (每封郵件前皆有數字)
 >d 1-3: 刪除第 1 ~ 3 封郵件
 >x: 離開,但郵件留在 MailBox 中 (下次進入還會看到讀取過的 Mail)
 >g: 離開,讀取過的郵件將轉移至 ~/mbox 中
 >h: 顯示所有信件
文章標籤: