天天看點

輸入輸出重定向

在了解重定向之前,我們先來看看linux 的檔案描述符。

linux檔案描述符:可以了解為linux跟蹤打開檔案,而配置設定的一個數字,這個數字有點類似c語言操作檔案時候的句柄,通過句柄就可以實作檔案的讀寫操作。 使用者可以自定義檔案描述符範圍是:3-num,這個最大數字,跟使用者的:ulimit –n 定義數字有關系,不能超過最大值。

linux啟動後,會預設打開3個檔案描述符,分别是:标準輸入standard input 0,正确輸出standard output 1,錯誤輸出:error output 2

以後打開檔案後。新增檔案綁定描述符 可以依次增加。 一條shell指令執行,都會繼承父程序的檔案描述符。是以,所有運作的shell指令,都會有預設3個檔案描述符。

一個指令執行了:

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

指令執行完成:成功了,會把成功結果輸出到螢幕:standard output預設是螢幕

指令執行有錯誤:會把錯誤也輸出到螢幕上面:standard error預設也是指的螢幕

檔案輸入輸出由追蹤為一個給定的程序所有打開檔案的整數句柄來完成。這些數字值就是檔案描述符。最為人們所知的檔案米描述符是 stdin, stdout 和 stderr,檔案描述符的數字分别是0,1和2。這些數字和各自的裝置是保留的。一個指令執行前,先會準備好所有輸入輸出,預設分别綁定(stdin,stdout,stderr),如果這個時候出現錯誤,指令将終止,不會執行。

這些預設的輸出,輸入都是linux系統内定的,我們在使用過程中,有時候并不希望執行結果輸出到螢幕。我想輸出到檔案或其它裝置。這個時候我們就需要進行輸出重定向了。

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或檔案操作符或裝置

上面指令意思是:将一條指令執行結果(标準輸出,或者錯誤輸出,本來都要列印到螢幕上面的)  重定向其它輸出裝置(檔案,打開檔案操作符,或列印機等等)1,2分别是标準輸出,錯誤輸出。

#顯示目前目錄檔案 test.sh test1.sh test1.sh實際不存在

[chengmo@centos5 shell]$ ls test.sh test1.sh

ls: test1.sh: 沒有這個檔案和目錄

test.sh

#正确輸出與錯誤輸出都顯示在螢幕了,現在需要把正确輸出寫入suc.txt

# 1>可以省略,不寫,預設所至标準輸出

[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt

[chengmo@centos5 shell]$ cat suc.txt 

#把錯誤輸出,不輸出到螢幕,輸出到err.txt

[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt

[chengmo@centos5 shell]$ cat suc.txt err.txt 

#繼續追加把輸出寫入suc.txt err.txt  “>>”追加操作符

[chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt 

#将錯誤輸出資訊關閉掉

[chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-

[chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null

#&[n] 代表是已經存在的檔案描述符,&1 代表輸出 &2代表錯誤輸出 &-代表關閉與它綁定的描述符

#/dev/null 這個裝置,是linux 中黑洞裝置,什麼資訊隻要輸出給這個裝置,都會給吃掉 

#關閉所有輸出

[chengmo@centos5 shell]$ ls test.sh test1.sh  1>&- 2>&- 

#關閉 1 ,2 檔案描述符

[chengmo@centos5 shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null

#将1,2 輸出轉發給/dev/null裝置 

[chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1

#将錯誤輸出2 綁定給 正确輸出 1,然後将 正确輸出 發送給 /dev/null裝置  這種常用

<p>[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null

#& 代表标準輸出 ,錯誤輸出 将所有标準輸出與錯誤輸出 輸入到/dev/null檔案

</p> 

注意:

1、shell遇到”>”操作符,會判斷右邊檔案是否存在,如果存在就先删除,并且建立新檔案。不存在直接建立。 無論左邊指令執行是否成功。右邊檔案都會變為空。

2、“>>”操作符,判斷右邊檔案,如果不存在,先建立。以添加方式打開檔案,會配置設定一個檔案描述符[不特别指定,預設為1,2]然後,與左邊的标準輸出(1)或錯誤輸出(2) 綁定。

3、當指令:執行完,綁定檔案的描述符也自動失效。0,1,2又會空閑。 

4、一條指令啟動,指令的輸入,正确輸出,錯誤輸出,預設分别綁定0,1,2檔案描述符。

5、一條指令在執行前,先會檢查輸出是否正确,如果輸出裝置錯誤,将不會進行指令執行

  • 輸入重定向

command-line [n] <file或檔案描述符&裝置

将然有,指令預設從鍵盤獲得的輸入,改成從檔案,或者其它打開檔案以及裝置輸入。執行這個指令,将标準輸入0,與檔案或裝置綁定。将由它進行輸入。

[chengmo@centos5 shell]# cat > catfile 

testing 

cat file test

#這裡按下 [ctrl]+d 離開 

#從标準輸入【鍵盤】獲得資料,然後輸出給catfile檔案

[chengmo@centos5 shell]$ cat>catfile <test.sh

#cat 從test.sh 獲得輸入資料,然後輸出給檔案catfile

[chengmo@centos5 shell]$ cat>catfile <<eof

test a file