在了解重定向之前,,我們先來看看linux 的文件描述符。
linux文件描述符:可以理解為linux跟蹤打開文件,,而分配的一個數字,,這個數字有點類似c語言操作文件時候的句柄,通過句柄就可以實現(xiàn)文件的讀寫操作,。 用戶可以自定義文件描述符范圍是:3-num,這個最大數字,,跟用戶的:ulimit –n 定義數字有關系,不能超過最大值,。
linux啟動后,,會默認打開3個文件描述符,分別是:標準輸入standard input 0,正確輸出standard output 1,錯誤輸出:error output 2
以后打開文件后,。新增文件綁定描述符 可以依次增加,。 一條shell命令執(zhí)行,都會繼承父進程的文件描述符,。因此,,所有運行的shell命令,都會有默認3個文件描述符,。
對于任何一條linux 命令執(zhí)行,,它會是這樣一個過程:
一個命令執(zhí)行了:
先有一個輸入:輸入可以從鍵盤,也可以從文件得到
命令執(zhí)行完成:成功了,,會把成功結果輸出到屏幕:standard output默認是屏幕
命令執(zhí)行有錯誤:會把錯誤也輸出到屏幕上面:standard error默認也是指的屏幕
文件輸入輸出由追蹤為一個給定的進程所有打開文件的整數句柄來完成,。這些數字值就是文件描述符。最為人們所知的文件米描述符是 stdin, stdout 和 stderr,,文件描述符的數字分別是0,,1和2。這些數字和各自的設備是保留的,。一個命令執(zhí)行前,,先會準備好所有輸入輸出,默認分別綁定(stdin,stdout,stderr),,如果這個時候出現(xiàn)錯誤,,命令將終止,,不會執(zhí)行。命令解析過程,,可以參考:Linux Shell 通配符,、元字符、轉義符使用實例介紹
這些默認的輸出,,輸入都是linux系統(tǒng)內定的,,我們在使用過程中,有時候并不希望執(zhí)行結果輸出到屏幕,。我想輸出到文件或其它設備,。這個時候我們就需要進行輸出重定向了。
linux shell下常用輸入輸出操作符是:
1. 標準輸入 (stdin) :代碼為 0 ,,使用 < 或 << ,; /dev/stdin -> /proc/self/fd/0 0代表:/dev/stdin
2. 標準輸出 (stdout):代碼為 1 ,使用 > 或 >> ,; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout
3. 標準錯誤輸出(stderr):代碼為 2 ,,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr
格式:
command-line1 [1-n] > file或文件操作符或設備
上面命令意思是:將一條命令執(zhí)行結果(標準輸出,,或者錯誤輸出,,本來都要打印到屏幕上面的) 重定向其它輸出設備(文件,打開文件操作符,,或打印機等等)1,2分別是標準輸出,,錯誤輸出。
實例:
02 |
[chengmo@centos5 shell]$ ls test .sh test1.sh |
03 |
ls : test1.sh: 沒有這個文件和目錄 |
08 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 1>suc.txt |
09 |
ls : test1.sh: 沒有這個文件和目錄 |
10 |
[chengmo@centos5 shell]$ cat suc.txt |
14 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 1>suc.txt 2>err.txt |
15 |
[chengmo@centos5 shell]$ cat suc.txt err.txt |
17 |
ls : test1.sh: 沒有這個文件和目錄 |
19 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 1>>suc.txt 2>>err.txt |
22 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 2>&- |
24 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 2>/dev/null |
30 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 1>&- 2>&- |
32 |
[chengmo@centos5 shell]$ ls test .sh test1.sh 2>/dev/null 1>/dev/null |
34 |
[chengmo@centos5 shell]$ ls test .sh test1.sh >/dev/null 2>&1 |
36 |
<P>[chengmo@centos5 shell]$ ls test .sh test1.sh &>/dev/null |
注意:
1,、shell遇到”>”操作符,會判斷右邊文件是否存在,,如果存在就先刪除,,并且創(chuàng)建新文件,。不存在直接創(chuàng)建。 無論左邊命令執(zhí)行是否成功,。右邊文件都會變?yōu)榭铡?/p>
2,、“>>”操作符,判斷右邊文件,,如果不存在,,先創(chuàng)建。以添加方式打開文件,,會分配一個文件描述符[不特別指定,,默認為1,2]然后,與左邊的標準輸出(1)或錯誤輸出(2) 綁定,。
3,、當命令:執(zhí)行完,綁定文件的描述符也自動失效,。0,1,2又會空閑,。
4、一條命令啟動,,命令的輸入,,正確輸出,錯誤輸出,,默認分別綁定0,1,2文件描述符,。
5、一條命令在執(zhí)行前,,先會檢查輸出是否正確,,如果輸出設備錯誤,將不會進行命令執(zhí)行
格式:
command-line [n] <file或文件描述符&設備
將然有,,命令默認從鍵盤獲得的輸入,,改成從文件,或者其它打開文件以及設備輸入,。執(zhí)行這個命令,,將標準輸入0,與文件或設備綁定,。將由它進行輸入,。
實例:
01 |
[chengmo@centos5 shell] |
07 |
[chengmo@centos5 shell]$ cat >catfile < test .sh |
11 |
[chengmo@centos5 shell]$ cat >catfile <<eof |
格式:
exec 文件描述符[n] <或> file或文件描述符或設備
在上面講的輸入,,輸出重定向 將輸入,輸出綁定文件或設備后,。只對當前那條指令是有效的,。如果需要在綁定之后,接下來的所有命令都支持的話,。就需要用exec命令
實例:
01 |
[chengmo@centos5 shell]$ exec 6>&1 |
04 |
[chengmo@centos5 shell]$ ls /proc/self/fd/ |
08 |
[chengmo@centos5 shell]$ exec 1>suc.txt |
11 |
[chengmo@centos5 shell]$ ls -al |
14 |
[chengmo@centos5 shell]$ exec 1>&6 |
18 |
[chengmo@centos5 shell]$ exec 6>&- |
21 |
[chengmo@centos5 ~]$ ls /proc/self/fd/ |
說明:使用前先將標準輸入保存到文件描述符6,,這里說明下,文件描述符默認會打開0,1,2 還可以使用自定義描述符 ,。然后對標準輸出綁定到文件,,接下來所有輸出都會發(fā)生到文件。 使用完后,,恢復標準的輸出,,關閉打開文件描述符6。
有趣事情:
可能有朋友會這樣用:exec 1>suc.txt ,,接下來所有輸出都綁定到suc.txt 文件,,那么怎么樣恢復原來的呢? 試試你就會發(fā)現(xiàn)問題所在……
學習就要總結,,總結才可以提高了,。哈哈!
估計還有一些朋友是頭暈暈的,。怎么linux的重定向這么復雜呢,,又是文件打開描述符又是讀,還有些,,還有默認標準輸入輸出,。
其實,總結一下,,重定向應用通常就以下兩點:
1,、重新設置命令的默認輸入,輸出,,指向到自己文件(文件,,文件描述符,設備其實都是文件,因為linux就是基于設備也是文件,,描述符也指向是文件,,哈哈)
2,、擴展自己新的描述符,,對文件進行讀寫操作