1. 程式人生 > >第4章 處理使用者輸入與顯示資料------------(標準檔案描述符、STDIN/STDERR/STDOUT、臨時重定向、永久重定向exec)

第4章 處理使用者輸入與顯示資料------------(標準檔案描述符、STDIN/STDERR/STDOUT、臨時重定向、永久重定向exec)

4.4 顯示資料

4.4.1 標準檔案描述符

         Linux系統將每個物件當作檔案處理。這包括輸入和輸出過程。Linux使用檔案描述符(file descriptor)標識每個檔案物件。檔案描述符是一個非負整數,可以唯一地標識會話中開啟的檔案。每個進行最多可以有9個開啟檔案的描述符。bash shell為特殊需要保留前3個檔案描述符(0,1,2),如下所示:

            

         這3個特殊檔案描述符處理指令碼的輸入和輸出。shell使用它們將shell中的預設輸入和輸出定向到相應位置(預設位置通常是監視器)。

        1.STDIN

         STDIN檔案描述符引用shell的標準輸入。對於終端介面,標準輸入是鍵盤。shell通過STDIN檔案描述符從鍵盤接受輸入,並在鍵入時處理每個字元。

         使用輸入重定向符號(<)時,Linux將使用重定向引用的檔案替換標準的輸入檔案描述符。它讀取檔案並獲取資料,就像是通過鍵盤鍵入的一樣。

         許多bash命令通過STDIN接收輸入,尤其在命令列沒有指定檔案時。操作例項如下:

            

         也可以使用STDIN重定向符號強制cat命令從STDIN以外的其他檔案接收輸入。現在cat命令使用包含在檔案中的行行為輸入。可以使用該技術將資料輸入到任何從STDIN接收資料的shell命令。

             

         2.STDOUT

         STDOUT檔案描述符引用shell的標準輸出。在終端介面,標準輸出是終端監視器。shell的所有輸出都定向到標準輸出,也就是監視器。

         許多bash命令預設將輸出定向到STDOUT檔案描述符。使用輸出重定向符號,所有通常定向到監視器的輸出現在都重定向到shell指定的重定向檔案。還可以使用>>符號向檔案新增資料。

         當命令生成錯誤訊息時,shell不會將錯誤訊息重定向到輸出重定向檔案。shell建立了輸出重定向檔案,但是錯誤訊息顯示在監視器螢幕上。shell將錯誤訊息與正常輸出分開處理。如果建立一個以後臺模式執行的shell指令碼,則通常必須依賴將傳送到日誌檔案的輸出訊息。

          

         3.STDERR

         shell使用特殊的STDERR檔案描述符處理錯誤訊息。STDERR檔案描述符引用shell的標準錯誤輸出。預設情況下,STDERR檔案描述符與STDOUT檔案描述符指向相同的位置(即使它們分配了不同的檔案描述符值)。預設情況下,所有的錯誤訊息都顯示在監視器上。

4.4.2 重定向錯誤

         重定向STDERR資料的方式也沒什麼不同,只需要在使用重定向符號時定義STDERR檔案描述符即可。

         1.僅重定向錯誤

         STDERR檔案描述符的值設定為2.通過替換位於重定向符號前方的這個檔案描述符,可以僅重定向錯誤訊息。該值必須位於重定向符號的正前方,否則無效。命令生成的任何錯誤訊息將包含在輸出檔案中。使用這種方法,shell僅重定向錯誤訊息,不包括普通資料。由於命令將檔案描述符2輸出(STDERR)重定向到輸出檔案,因此shell將所有生成的錯誤訊息傳送到指定的重定向檔案。

         僅重定向操作例項:

                    

         2.重定向錯誤和資料

         如果需要同時重定向錯誤和普通資料,則必須使用重定向符號。必須在希望重定向的資料前面放置相應的檔案描述符,然後將它們指向相應的輸出檔案以儲存資料。

         通過1>符號,shell將定向到STDOUT的普通輸出重定向到相應的檔案。通過2>符號,將應該定向到STDERR的錯誤訊息重定向到相應的檔案。

         可以使用這項技術將指令碼中發生的任何錯誤訊息與普通指令碼輸出分離開來。同時,如果需要,也可以將STDERR和STDOUT輸出重定向到同一個輸出檔案。為此,bash shell提供了一個特殊的重定向符號,即&>符號。使用&>符號,命令生成的所有輸出都發送到同一位置,包括資料和錯誤。bash shell自動使錯誤訊息的優先順序高於標準輸出。

4.4.3 臨時重定向

         在指令碼中使用STDOUT和STDERR檔案描述符在多個位置生成輸出,只要重定向相應的檔案描述符即可。使用指令碼重定向輸出的方法有兩種:臨時重定向每一行、在指令碼中永久重定向所有命令

         如果想要故意在指令碼中生成錯誤訊息,可以將單個輸出行重定向到STDERR。需要做的只是使用輸出重定向符號將輸出重定向到STDERR檔案描述符。重定向到某個檔案描述符時,必須在檔案描述符編號前面新增&號。預設情況下,Linux將STDOUT輸出定向到STDOUT。但是,如果執行指令碼時重定向STDERR任何使用指令碼定向到STDERR的文字將被重定向

         該方法對於在指令碼中生成錯誤訊息非常好。如果有人使用指令碼,可以使用STDERR檔案描述符輕鬆地重定向錯誤訊息。

         臨時重定向操作例項:            

#!/bin/bash
#重定向到某個檔案描述符時
#必須在檔案描述符編號前面加&

echo "This is error!" >&2
echo "This is normal text!"

         使用STDOUT顯示的文字出現在監控器上,而傳送到STDERR的echo語句文字重定向到輸出檔案。

4.4.4永久重定向

         如果在指令碼中重定向許多資料,那麼重定向每個echo語句就不太方便了。這種情況下,可以使用exec命令通知shell在指令碼執行期間重定向特定的檔案描述符。exec命令啟動一個新的shell,並將STDOUT檔案描述符重定向到一個檔案。所有定向到STDOUT的指令碼輸出都將重定向到相應檔案。               

#!/bin/bash
#永久重定向:
#使用exec命令通知shell在指令碼執行期間重定向特定的檔案描述符

exec 2>testerror
echo "This is a standar error!"
echo "this is the start of the script"


exec 1>testout

echo "This is a test of redirecting all output"
echo "from a script to another file."
echo "without having to redirect every individual line" >&2

         指令碼使用exec命令將任何定向到STDERR的輸出重定向到檔案testerror。接下來,指令碼使用echo命令將STDOUT顯示幾行,之後再次使用exec命令將STDOUT重定向到testout檔案。注意:即使重定向了STDOUT,也可以指定echo語句的輸出定向到STDERR。如果只想將部分指令碼的輸出重定向到另一個位置,該特性將十分方便。但是重定向STDOUT或STDERR之後,就無法輕鬆地將它們重定向到原來的位置。

4.4.5 在指令碼中重定向輸入

         重定向STDOUT和STDERR的技術同樣可以用來重定向鍵盤的STDIN。exec命令可以幫助將STDIN重定向到Linux系統的檔案。exec 0< testfile,該命令告知shell它應該從該檔案testfile而不是STDIN獲取輸入。在指令碼請求輸出的任何時間都可使用這種重定向方式。

         read命令讀取使用者通過鍵盤輸入的資料。通過將STDIN重定向到檔案,在read命令嘗試從STDIN讀取命令時,它將從檔案而不是鍵盤獲取資料。這是一個非常好的技術,可以讀取檔案的資料並使用指令碼處理。Linux系統管理員常見的一個任務是,從日誌檔案讀取資料並進行處理。

         在指令碼中重定向輸入例項:     

#!/bin/bash
#在指令碼中重定向輸入
exec 0< continue.txt
count=1

while read line
do
   echo "File #$count:$line"
   count=$[ $count+1 ]
done

相關推薦

4 處理使用者輸入顯示資料------------(標準檔案描述STDIN/STDERR/STDOUT臨時定向永久定向exec)

4.4 顯示資料 4.4.1 標準檔案描述符          Linux系統將每個物件當作檔案處理。這包括輸入和輸出過程。Linux使用檔案描述符(file descriptor)標識每個檔案物件。檔案描述符是一個非負整數,可以唯一地標識會話中開啟的檔案。每個進行最多可以

4 處理使用者輸入顯示資料------------(getopt命令)

4.2.3 使用getopt命令          getopt命令是個不錯的工具,在處理命令列選項和引數時非常方便。它對命令列引數進行重現組織,使其更便於在指令碼中解析。 1.命令格式          getopt命令可以接受任意形式的命令列選項和引數列表,並自動將這些

redis實戰筆記(4)-4 數據安全性能保障

4.6 特殊 pac 命名 可用 lsp sentinel 樂觀鎖 個人開發 本章主要內容 4.1 將數據持久化至硬盤 4.2 將數據復制至其他機器 4.3 處理系統故障 4.4 Redis事務 4.5 非事務型流水線( non-transactional pipeline

4 ZK基本特性基於Linux的ZK客戶端命令列學習

ZK基本特性與基於Linux的ZK客戶端命令列學習 4-1 zookeeper常用命令列操作 4-2 session的基本原理與create命令的使用 4-3 set與delete命令的使用 4-4 zk特性 – 理解watcher機制 4-5

4 css文字text字型font-face

text-overflow 與 word-wrap text-overflow:用來設定是否使用一個省略標記(...)標示物件內文字的溢位。 語法: 但是text-overflow只是用來說明文字溢位時用什麼方式顯示,要實現溢位時產生省略號的效果,還須定義強制文字在一行內顯示(white-space:n

《瘋狂Java講義(4版)》-----4【流程控制陣列】

Java7增強後的switch語句 switch後的控制表示式只能是byte、short、char、int、列舉型別和java.lang.String型別。 char c = 'A'; switch(c){ case 'A': System.out.pri

易學筆記-go語言-4:基本結構和基本資料型別/4.4 變數/4.4.3 函式體內最簡單的變數初始化

函式體內最簡單的變數賦值 格式:  變數名 := 值 舉例: var goos string = os.Getenv("GOOS") fmt.Printf("The operating system is: %s\n", goos) //函式體內最

易學筆記-go語言-4:基本結構和基本資料型別/4.4 變數/4.4.2 宣告和賦值語句結合

宣告和賦值語句結合 格式:var identifier [type] = value 這裡的type是可選的,具體的型別參照: 第4章:基本結構和基本資料型別/4.2 Go 程式的基本結構和要素/4.2.8 型別 顯式型別舉例: //整型 var a&nbs

易學筆記-go語言-4:基本結構和基本資料型別/4.4 變數/4.4.4 函式體內並行初始化

函式體內並行賦值 在 第4章:基本結構和基本資料型別/4.4 變數/4.4.3 函式體內最簡單的變數賦值基礎上,多個變數同時賦值 舉例: 程式碼: a, b, c := 5, 10, "易學筆記"     fmt.Printf("a&n

易學筆記-Go語言-4:基本結構和基本資料型別/4.5 基本型別/4.5.2 整形

 整形 固定位元組數整形:與作業系統無關 int 和 uint 在 32 位作業系統上,它們均使用 32 位(4 個位元組),在 64 位作業系統上,它們均使用 64 位(8 個位元組)。 uintptr 存放指標 指定位元組

易學筆記-Go語言-4:基本結構和基本資料型別/4.5 基本型別/4.5.1 bool型別

 bool型別 關鍵字:bool,兩個結果:true 或者 false 何時回產生bool型別 ==:相等性筆記 !=:不相等性筆記 >、>=、<、<=:比較 可以進行的邏輯運算

易學筆記-Go語言-4:基本結構和基本資料型別/4.4 變數/4.4.7 變數的作用域

變數的作用域 變數的作用域有幾種: 包間變數:也是在函式外宣告的變數,而且第一個字母是大寫,所有本包函式或者包外函式都可見 全域性變數:在函式外宣告的變數,所有函式都可見 區域性變數:在本函式內部都可見 塊變數:僅僅在某個塊中可見,

4:基本結構和基本資料型別/4.2 Go 程式的基本結構和要素/4.2.5 可見性

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

4:基本結構和基本資料型別/4.2 Go 程式的基本結構和要素/4.2.4 import:匯入包

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

4:基本結構和基本資料型別/4.2 Go 程式的基本結構和要素/4.2.6 函式

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

易學筆記-Go語言-4:基本結構和基本資料型別/4.6 字串概述/4.6.1 字串表示

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

易學筆記-Go語言-4:基本結構和基本資料型別/4.5 基本型別/4.5.6 位運算

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

易學筆記-Go語言-4:基本結構和基本資料型別/4.5 基本型別/4.5.7 隨機數

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

《影象處理分析機器視覺》(4版)閱讀筆記—— 影象及其數學物理背景

3.1 概述 3.1.1 線性 向量(線性)空間(vector(linear) space) 3.1.2 狄拉克(Dirac)分佈和卷積 理想的衝擊是一個重要的輸入訊號,影象平面上的理想衝擊是用狄拉克分佈(Dirac distribution)定義的,。相當於訊號處理中的單位階躍函式

Core Java Volume I 讀書筆記--4 對象

volume nod sina x86 userinfo -- tar .com ndt 20r拿3角51諼3http://weibo.com/p/1005056264972659 SI境嗇7U侍凡17院http://shequ.docin.com/dpyy387 宦3