天天看點

shell程式設計之重定向

一、重定向簡介

1.重定向基本概念:

計算機最基礎的功能是可以提供輸入輸出操作,常見的輸入輸出有鍵盤、滑鼠、掃描器等,對于Linux系統來說,通常以鍵盤為預設輸入裝置,又稱标準輸入裝置;計算機常見的輸入裝置有顯示器、蜂鳴器、列印機等,而Linux系統則以顯示器為預設輸出裝置,又稱标準輸出裝置。所謂“重定向”,就是将原本應該從标準輸入裝置(鍵盤)輸入的資料,改由其他檔案或裝置輸入;或将原本應該輸出到标準輸出裝置(顯示器)的内容,改而輸出到其他檔案或裝置上。、

2.檔案辨別符和标準輸入輸出

檔案辨別符是重定向中很重要的一個概念,Linux使用0到9的整數指明了與特定程序相關的資料流,系統在啟動一個程序的同時會為該程序打開三個檔案:标準輸入、标準輸出、标準錯誤輸出,分别用檔案辨別符0、1、2來辨別。如果要為·程序打開其他的輸入輸出,則需要從整數3開始辨別。預設情況下,标準輸入為鍵盤,标準輸出和錯誤為顯示器。

I/O重定向

I/O重定向是重定向中的一個重要部分,在Shell程式設計中會有很多機會用到這個功能。簡單來說,I/O從重定向可以将任何檔案、指令、腳本、程式或腳本的輸出重定向到另外一個檔案、指令、程式或腳本。

I/O重定向常見符号和功能描述:

符号        含義

>     标準輸出覆寫重定向:将指令的輸出重定向輸出到其他檔案

>>     标準輸出追加重定向:将指令的輸出重定向輸出到其他檔案中,同時會覆寫檔案中的已有檔案

>&     辨別輸出重定向:将一個辨別的輸出重定向到另一個辨別的輸入

<     标準輸入重定向:指令将從指定檔案中讀取輸入而不是從鍵盤輸入

|      管道:從一個指令中讀取輸出并作為另一個指令的輸入

1.标準輸出覆寫重定向:>

使用标準輸出覆寫重定向符号可以将原本輸出到顯示器上的内容重定向到一個檔案中,比如使用ls -l可以列出指定目錄中檔案的詳細資訊,但是如果想把結果儲存檔案中以便日後檢視,則可以使用标準輸出覆寫重定向符。

[root@Cfhost-170820-UCNK ~]# ls -l /usr/ > ls_user.txt

#注意到回車後并沒有任何輸出,因為輸出被重定向到檔案中

[root@Cfhost-170820-UCNK ~]# cat ls_user.txt#此檔案内容和ls -l /usr/指令輸出一緻

total 68

dr-xr-xr-x 2 root root 20480 Nov 26 16:32 bin

drwxr-xr-x 2 root root 4096 Sep 23 2011 etc

drwxr-xr-x 2 root root 4096 Sep 23 2011 games

drwxr-xr-x 33 root root 4096 Nov 26 16:18 include

dr-xr-xr-x 12 root root 4096 Nov 26 16:18 lib

dr-xr-xr-x 29 root root 12288 Nov 26 16:18 lib64

drwxr-xr-x 7 root root 4096 Nov 26 16:18 libexec

drwxr-xr-x 12 root root 4096 Jun 9 2012 local

dr-xr-xr-x 2 root root 4096 Nov 26 16:18 sbin

drwxr-xr-x 59 root root 4096 Jun 9 2012 share

drwxr-xr-x 4 root root 4096 Jun 9 2012 src

lrwxrwxrwx 1 root root 10 Nov 26 14:25 tmp -> ../var/tmp

2.标準輸出追加重定向:>>

該符号用法和>完全一緻,不同的隻是如果指定的重定向檔案存在且内容不為空,重定向并不會清空原檔案内容,而是将指令的輸出新增到原檔案尾部。在下面的例子中/usr/和/tmp/目錄中列出的内容追加重定向到append.txt檔案

[root@Cfhost-170820-UCNK ~]# ls -l /usr/noExist > ls_noExist.txt

ls: cannot access /usr/noExist: No such file or directory

[root@Cfhost-170820-UCNK ~]# ls -l /usr/ >> append.txt

[root@Cfhost-170820-UCNK ~]# ls -l /tmp/ >> append.txt

[root@Cfhost-170820-UCNK ~]# cat append.txt

total 0

 使用exec

exec是shell的内建指令,執行這個指令時系統不會啟動新的shell,而是用要被執行的指令替換目前的shell程序。是以假設在一個shell中執行exec ls,則在列出目前目錄後該shell程序将會主動退出--如果使用ssh進行遠端連接配接,則目前連接配接也會在執行完這個指令後斷開。除此之外,exec還可以用于I/O重定向

exec < file 将file檔案種1的内容作為exec的标準輸入

exec >file 将file檔案作為标準輸出

exec3<file 指定檔案辨別符

exec3 <&- 關閉檔案辨別符

exec3>file 将寫入指定檔案辨別符的内容寫入指定檔案(這裡的檔案是file)

exec4<&3 建立檔案辨別符3的拷貝4

繼續閱讀