Standard Input and Output

 



Linux提供了三種標準I/O,分別為:
standard input (STDIN) 代號 0:標準輸入,預設為鍵盤
standard output (STDOUT) 代號 1:標準輸出,預設為終端機視窗
standard error (STDERR) 代號 2:標準錯誤輸出,預設為終端機視窗
簡單描述一下,當我要執行一個指令時,要透過鍵盤(STDIN)將指令輸入到系統,系統會將指令執行結果輸出到螢幕上面(標準輸出),而預設上如果執行時有錯誤發生,也會將錯誤訊息輸出到螢幕上(STDERR)。

[root@localhost CH7]# ls
test
這是一個最簡單的標準輸出,執行ls,系統會顯示目錄下有個test的檔案

[root@localhost CH7]# ls xiang
ls: 無法存取 xiang: 沒有此一檔案或目錄
這個則是標準錯誤輸出,因為我目錄下並沒有xiang這個檔案,所以這個指令執行時會發生錯誤。


重新導向

剛剛說過Linux系統的標準輸入為鍵盤,標準輸出及標準錯誤輸出為螢幕,這些都是預設值,在我們需要的時後也可以做些改變,像是我可以將標準輸出輸出到檔案:
> :將標準輸出,輸出到指定的檔案
2> :將標準錯誤輸出,輸出到指定的檔案
&>:將標準輸出及錯誤輸出,輸出到指定的檔案

>
[root@localhost CH7]# ls > stdout.list
[root@localhost CH7]# cat stdout.list
stdin.list
test
這裡將標準輸出輸出到檔案stdin.list,所以螢幕上不會有ls執行的結果,之後在使用cat看stdin.list的內容。

2>
[root@localhost CH7]# ls xiang 2>stderr.list
[root@localhost CH7]# cat stderr.list
ls: 無法存取 xiang: 沒有此一檔案或目錄
這是將標準錯誤輸出,輸出到檔案的範例。

&>
這個則是將標準輸出與標準錯誤輸出全都輸出到指定的檔案


另外要注意,使用 > 這個符號,它會將檔案覆蓋,也就是說如果之前檔案已經有別的東西了,如果使用>輸出到該檔案,會先把之前的內容刪掉,在把這次的執行結果存到檔案裡。如果不想將檔案覆蓋掉,可以使用>>,這樣會將結果附加到該檔案下面,而不會覆蓋檔案。



除了指到檔案之外,也可以將STDOUT重新導向給程式去執行,這時就會用到Pipe |(管線):

command1 | command2
利用 |(管線)將command1的執行結果,作為command2的STDINPUT

也可以使用Mutiple Pipe:
command1 | command2 |command3 ......

另外要注意的是,STDERR 不支援這個功能!

[root@localhost ~]# ls -l /etc |grep '.conf'
-rw------- 1 root root 2726 2008-11-11 14:09 autofs_ldap_auth.conf
-rw-r--r-- 1 root root 351 2007-09-28 06:07 capi.conf
-rw-r--r-- 1 root root 17708 2007-09-19 00:38 dnsmasq.conf
-rw-r--r-- 1 root root 368 2007-10-26 23:59 esd.conf
drwxr-xr-x 6 root root 4096 2008-07-10 16:10 gconf
-rw-r--r-- 1 root root 1756 2007-08-24 16:48 gpm-root.conf
lrwxrwxrwx 1 root root 22 2008-07-10 16:34 grub.conf -> ../boot/grub/grub.conf
我把ls -l /etc的執行結果指給 grep '.conf'當輸入,grep這個指令就會從 ls -l /etc這個執行結果去找裡面有 .conf的檔案


Redirecting STDIN from a file

重新導向標準輸入可以 < 這個符號,我們可以是先將資料寫在一個檔案裡,在把這個檔案當作標準輸入給指令使用:

[root@localhost CH7]# cat stdin.txt
abc
def
ghi
我事先在stdin.txt裡打了這些資料,在來將這個檔案當作標準輸入給指令使用:

[root@localhost CH7]# tr 'a-z' 'A-Z'
ABC
DEF
GHI
tr這個指令是用來變換一些指定的字,這個範例是將小寫字改成大寫,這裡的標準輸入是那個stdin.txt檔案,所以可以看到結果如上。要注意的事,這樣並不會修改stdin.txt的內容,它只是將內容輸出給tr指令使用罷了。


arrow
arrow
    全站熱搜

    xiangyang17 發表在 痞客邦 留言(0) 人氣()