文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Shell Input and Output Management

Shell Input and Output Management

时间:2007-09-02  来源:yixiaoyun

Shell Input and Output Management
 

HP 諮詢中心工程師 張俊明 文

前言
輸入/輸出重新導向是 shell 用來處理標準輸入(standard input)、標準輸出(standard output)與標準錯誤(standard error)的重要功能。它可將指令執行的輸出導向到檔案中,也可以將執行程式或指令所需的引數或輸入由檔案導入,其應用範圍可說相當廣範。
本文將介紹其基本的觀念。


在HP-UX上每一個unix 的process預設來說都有60個file descriptors (從0到59)。

一般說來,前三個file descriptor在process開始執行時就會被啟動: file descriptor 0就是standard input (stdin標準輸入),file descriptor 1 為 standard output (stdout標準輸出) ,而 file descriptor 2 則為 standard error output(stderr標準錯誤輸出)。對於一個UNIX程式來說, 它會從”標準輸入”做讀取 (如:鍵盤) 而將輸出寫到”標準輸出”(如:螢幕)。以下我們要來看如何在UNIX Shell中對

這三個標準的file descriptor做導向和管理。


1.Standard input/output redirection

 

語法 說明
cmd < file 將stdin導向至file
cmd > file 將stdout導向至file
cmd >> file 將stdout導向至file並且將輸出內容附加在檔案之後
cmd 2> error.log 將stderr導向至error.log
cmd & 將指令在背景執行
cmd 2>&1 & 指令在背景執行,並將stderr導向至stdout


利用重新導向我們可將原本的標準輸出及輸入導向至其它的地方。

例如:

將指令date的標準輸出導向至檔案/tmp/datelog。

#date > /tmp/datelog

將指令mail的標準輸入來源指定為/etc/hosts。

#mail [email protected] < /etc/hosts

將指令tar的標準錯誤輸出導向至檔案/tmp/tar.err。

#tar cvf /dev/rmt/0m /home 2> /tmp/tar.err

# cat /tmp/tar.err

tar: cannot open /dev/rmt/0m



2. pipeline and tee

利用pipeline ‘|’ 我們可以將一個指令的的輸出導向為下另一個指令的輸入。

例如:

#du –sk /home/* | sort –rn

 

透過’|’將指令du的輸出結果導向為指令sort的輸入來源,其結果就相當於下列二行指令的效果:

#du –sk /home/* > dulog
#sort –rn < dulog

通常當第一個指令的標準輸出透過pipeline重新導向成第二個指令的輸入時,得到的結果是第二個指令的輸出,我們無法看到中間第一個指令的輸出結果。
但是利用tee這個指令,可以從標準輸入讀取後,將輸出導向至標準輸出及所指定的檔案。

#du –sk /home/* | tee /tmp/du-unsort | sort -rn
2408 /home/hcc
312 /home/ftp
296 /home/cynthia
40 /home/eng
32 /home/hpems
#cat /tmp/du-unsort
296 /home/cynthia
40 /home/eng
312 /home/ftp
2408 /home/hcc
32 /home/hpems



3. Special file descriptors
語法 說明
exec N> filename Open filename for writing (associate with file descriptor N)
exec N< filename Open filename for reading (associate with file descriptor N)
exec N< &- Closes input for file descriptor N
exec N<&- Closes output for file descriptor N

例如:

#exec 3> desfile 將file descriptor 3連結至檔案desfile做輸出用

#date >&3 將指令date的標準輸出(stdout)導向至descriptor 3

#du –sk /home/* >&3 將指令du的標準輸出(stdout)導向至descriptor 3

#exec 3>&- close output for descriptor 3
#cat desfile
hputain:/etc/rc.config.d>cat desfile
Tue May 6 15:35:59 EAT 20

0    
296   
40   
312  
2408 
32
/home/admin
/home/cynthia
/home/eng
/home/ftp
/home/hcc
/home/hpems

使用special file descriptors的好處在於在關閉此file descriptor之前,所有輸出至此descriptor所連結的檔案,
將會附加在檔案後面而不會蓋掉之前所寫入的資料。且這種寫法會比使用>>來的有效率,
因為使用>>,每一個指令都會將檔案open再close,而使用special file descriptors將會使檔案處於被打開的狀態直到它被關閉為止。



4. Using file descriptors to read/write.

在shell script中,我們可以用read及print加上選項-u將其標準輸出或輸入連結至file descriptor所連結的檔案。

例如:

(1)open file for writing
將file descriptor 4連結至檔案/tmp/outfile做輸出用,然後print –u4會將其結果輸出至file descriptor 4所指向的檔案(/tmp/outfile)。

#!/usr/bin/sh
exec 4> /tmp/outfile
print -u4 "======="$(date)"========="
bdf >&4
exec 4>&-
exit

# cat /tmp/outfile

=======Wed May 7 02:40:43 EAT 2003=========
Filesystem kbytes used avail %used Mounted on
/dev/vg00/lvol3 6479872 2614242 3624079 42% /
/dev/vg00/lvol1 295024 36384 229136 14% /stand
/dev/vg01/lvol1 17772544 6989096 10614960 40% /oracle

(2) Open file for reading

#cat /tmp/wholist
root pts/td May 7 15:58
wang pts/0 May 6 12:00
jimmy pts/5 May 2 14:46

下例的程式會將上面的檔案(/tmp/wholist)內容前二行列印出來。首先將file descriptor 5的連結至
檔案/tmp/wholist做讀取,然後read -u5會從file descriptor 5所指定的檔案讀取資料。

#!/usr/bin/sh
exec 5< /tmp/wholist
read -u5 user1
read -u5 user2

print "The first user is: \n $user1"
print "The second user is: \n $user2"

exec 5<&-
exit

執行此script的結果
#/tmp/read.sh
root pts/td May 7 15:58
wang pts/0 May 6 12:00

結語

善用UNIX程式輸出/輸入可導向的特性,可使日常系統管理指令及shell programming的彈性
及效率大為提高。望本文能對各位有所幫助。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载