標準輸入及輸出 Standard Input and Output
以下為常用數值 (實際上不只此三個數值而是 0 ~ 10)。- 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。
- <: 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) 結果導至不同的檔案。
$ 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 中。
$ 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 讀取系統郵件,常用操作如下:
$ 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: 顯示所有信件