久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

linux shell數據重定向(輸入重定向與輸出重定向)詳細分析

 肥熊 2011-07-20

在了解重定向之前,,我們先來看看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í)行,,它會是這樣一個過程:

image

一個命令執(zhí)行了:

先有一個輸入:輸入可以從鍵盤,也可以從文件得到

命令執(zhí)行完成:成功了,,會把成功結果輸出到屏幕:standard output默認是屏幕

命令執(zhí)行有錯誤:會把錯誤也輸出到屏幕上面:standard error默認也是指的屏幕

 

文件輸入輸出由追蹤為一個給定的進程所有打開文件的整數句柄來完成,。這些數字值就是文件描述符。最為人們所知的文件米描述符是 stdin, stdoutstderr,,文件描述符的數字分別是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分別是標準輸出,,錯誤輸出。

實例:

01 #顯示當前目錄文件 test.sh test1.sh test1.sh實際不存在
02 [chengmo@centos5 shell]$ ls test.sh test1.sh
03 ls: test1.sh: 沒有這個文件和目錄
04 test.sh
05   
06 #正確輸出與錯誤輸出都顯示在屏幕了,,現(xiàn)在需要把正確輸出寫入suc.txt
07 # 1>可以省略,,不寫,默認所至標準輸出
08 [chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt
09 ls: test1.sh: 沒有這個文件和目錄
10 [chengmo@centos5 shell]$ cat suc.txt 
11 test.sh
12   
13 #把錯誤輸出,,不輸出到屏幕,,輸出到err.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 
16 test.sh
17 ls: test1.sh: 沒有這個文件和目錄
18 #繼續(xù)追加把輸出寫入suc.txt err.txt  “>>”追加操作符
19 [chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt 
20   
21 #將錯誤輸出信息關閉掉
22 [chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-
23 test.sh
24 [chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null
25 test.sh
26 #&[n] 代表是已經存在的文件描述符,&1 代表輸出 &2代表錯誤輸出 &-代表關閉與它綁定的描述符
27 #/dev/null 這個設備,,是linux 中黑洞設備,,什么信息只要輸出給這個設備,都會給吃掉 
28   
29 #關閉所有輸出
30 [chengmo@centos5 shell]$ ls test.sh test1.sh  1>&- 2>&- 
31 #關閉 1 ,,2 文件描述符
32 [chengmo@centos5 shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null
33 #將1,2 輸出轉發(fā)給/dev/null設備 
34 [chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1
35 #將錯誤輸出2 綁定給 正確輸出 1,,然后將 正確輸出 發(fā)送給 /dev/null設備  這種常用
36 <P>[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null
37 #& 代表標準輸出 ,,錯誤輸出 將所有標準輸出與錯誤輸出 輸入到/dev/null文件
38 </P>

 

 

注意:

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]# cat > catfile 
02 testing 
03 cat file test 
04 #這里按下 [ctrl]+d 離開 
05 #從標準輸入【鍵盤】獲得數據,然后輸出給catfile文件
06   
07 [chengmo@centos5 shell]$ cat>catfile <test.sh
08 #cat 從test.sh 獲得輸入數據,,然后輸出給文件catfile
09   
10   
11 [chengmo@centos5 shell]$ cat>catfile <<eof
12 test a file
13 test!
14 eof
15   
16 #<< 這個連續(xù)兩個小符號,, 他代表的是『結束的輸入字符』的意思。這樣當空行輸入eof字符,輸入自動結束,,不用ctrl+D

 

 

  • exec綁定重定向

格式:

exec 文件描述符[n] <或> file或文件描述符或設備

在上面講的輸入,,輸出重定向 將輸入,輸出綁定文件或設備后,。只對當前那條指令是有效的,。如果需要在綁定之后,接下來的所有命令都支持的話,。就需要用exec命令

實例:

01 [chengmo@centos5 shell]$ exec 6>&1
02 #將標準輸出與fd 6綁定
03   
04 [chengmo@centos5 shell]$ ls  /proc/self/fd/  
05 0  1  2  3  6
06 #出現(xiàn)文件描述符6
07   
08 [chengmo@centos5 shell]$ exec 1>suc.txt
09 #將接下來所有命令標準輸出,,綁定到suc.txt文件(輸出到該文件)
10   
11 [chengmo@centos5 shell]$ ls -al
12 #執(zhí)行命令,發(fā)現(xiàn)什么都不返回了,,因為標準輸出已經輸出到suc.txt文件了
13   
14 [chengmo@centos5 shell]$ exec 1>&6
15 #恢復標準輸出
16   
17   
18 [chengmo@centos5 shell]$ exec 6>&-
19 #關閉fd 6描述符
20   
21 [chengmo@centos5 ~]$ ls /proc/self/fd/
22 0  1  2  3

說明:使用前先將標準輸入保存到文件描述符6,,這里說明下,文件描述符默認會打開0,1,2 還可以使用自定義描述符 ,。然后對標準輸出綁定到文件,,接下來所有輸出都會發(fā)生到文件。 使用完后,,恢復標準的輸出,,關閉打開文件描述符6。

有趣事情:

可能有朋友會這樣用:exec 1>suc.txt ,,接下來所有輸出都綁定到suc.txt 文件,,那么怎么樣恢復原來的呢? 試試你就會發(fā)現(xiàn)問題所在……

  • 復雜一點實例
01 exec 3<>test.sh;
02 #打開test.sh可讀寫操作,,與文件描述符3綁定
03   
04 while read line<&3
05  do
06     echo $line;
07 done
08 #循環(huán)讀取文件描述符3(讀取的是test.sh內容)
09 exec 3>&-
10 exec 3<&-
11 #關閉文件的,,輸入,輸出綁定

 

  • 總結下:

學習就要總結,,總結才可以提高了,。哈哈!

估計還有一些朋友是頭暈暈的,。怎么linux的重定向這么復雜呢,,又是文件打開描述符又是讀,還有些,,還有默認標準輸入輸出,。

其實,總結一下,,重定向應用通常就以下兩點:

1,、重新設置命令的默認輸入,輸出,,指向到自己文件(文件,,文件描述符,設備其實都是文件,因為linux就是基于設備也是文件,,描述符也指向是文件,,哈哈)

2,、擴展自己新的描述符,,對文件進行讀寫操作

分類: linux
標簽: linux, shell

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多