在Linux操作系統上編譯測試腳本文件或者應用程序的時候,往往需要不滿足只是將結果輸出到屏幕上,而是希望能夠將運行結果、錯誤信息、警告信息等等保存在一個文件中,以方便系統管理員進行分析與調整。雖然這也可以通過屏幕截屏或者屏幕錄像來完成,但是這得到的結果處理起來很不方便。如不方便查詢、不能夠過濾等等。為了解決這個問題,在Linux系統中提供了一個重定向的工具。在編程調試的過程中,可以利用重定向操作來存儲可執行文件的輸出結果。
一、將輸入輸出分別重定向到不同的文件。
在程序調試時,屏幕上的信息大致可以分為兩部分,分別為用戶的輸入與程序的輸出。有時候系統管理員在保存腳本程序輸出結果的同時,還是希望能夠保存用戶的輸入。只有如此,事後才能夠將輸入與輸出進行比較,來判斷是否是用戶輸入來不合法的參數所導致問題的出現。要事先這個需求的話,就需要使用如下的命令:應用程序名字 >輸出文件<輸入文件。在使用這個這個命令的時候,主要需要注意以下幾點。
一是要注意重定向的符號。重定向符號方向不同,其代表的含義也是不同的。如>符號表示輸出,即會將腳本程序的輸出內容保存到其後面定義的文件中。而符號<則表示輸入,即將用戶的輸入保存到其後面指定的文件中。如果這個符號寫錯的話,那麼其輸入輸出的內容保存位置就會出現錯誤。不過這個語法沒有問題,只是保存的地方相反了。
二是這些文件如果事先不存在的話,那麼系統會自動創建這些文件。但是如果存在的話,則系統會將原先的文件覆蓋掉。為此如果管理員在測試腳本程序的時候,如果需要保存原先的結果,那麼就需要將其保存在不同的文件中。或者采用另外的符號,不覆蓋原有的記錄,而只是進行追加。如可以利用>>符號來代替>。利用兩個>>符號在Linux系統中表示文件的追加。如此的話,即使原先的文件存在,系統也不會把記錄覆蓋掉,而是把輸出結果保存在原先的記錄下面。如此的話,系統管理員可以將前後的輸出結果進行對比,從而更有利於找出問題的原因。
不過無論采取覆蓋還是替換操作,都需要注意一個文件。利用重定向符號在記錄用戶輸出或者輸入內容的時候,需要注意一個問題,即如果應用程序輸出的是一些圖形界面,那麼這個重定向符號將無法保存這些信息。此時只有用過屏幕截屏或者屏幕錄像等手段才能夠將這些圖形的界面。另外如果不指定文件路徑的話,則系統會默認在當前目錄下創建這些文件並保存信息。如果系統管理員想在指定目錄下保存信息的話,則可以在上面的文件名稱前面加上路徑。在這個命令中,即支持決定路徑也支持相對路徑。如可以使用$HOME/文件名的方式,將輸出或者輸入結果保存在用戶的主目錄下。
二、將普通輸出與錯誤輸出保存在不同的文件中。
腳本程序的輸出其實包括兩部分內容,分別為正常的輸出與錯誤信息。這些內容都會在屏幕上反映。為了更加能夠說明問題,系統管理員可能喜歡將這些結果分別保存在不同的文件中。如此的話,對於系統管理員發現、跟蹤腳本出現的問題很有幫助。為了實現這個目的,就需要使用一些參數。
在Linux操作系統中,其輸出本來就分為兩類,分別為標准輸出流與錯誤輸出流。錯誤輸出流指的就是腳本程序執行過程中系統拋出的錯誤信息。而標准輸出流就指的是應用程序的執行結果。由於系統中本身就把他們當作不多的操作流來處理,為此就可以通過命令將標准輸出流與錯誤輸出流分開來存放。要實現這個需求的話,可以使用如下命令:>標准輸出文件名 2>錯誤輸出文件名。
其實在重定向符號前面還有一個參數,即采用的是什麼輸出流。參數1表示標准輸出流,參數2表示錯誤輸出流。默認情況下系統采用的是標准輸出流。為此1>就表示將標准輸出流(腳本程序的標准輸出結果)保存到某個文件中。由於1是默認值,為此可以不寫。而2>表示將錯誤信息流保存到指定的文件中。所以,通過這個方法就可以將腳本程序的正常輸出結果與錯誤信息分別保存到不同的文件中。有時後系統管理員可能只需要查看這個錯誤文件,就可以找到問題的原因了。如有些時候,系統管理員可能需要長期跟蹤應用程序的執行情況。為此會要求操作系統當這個保存錯誤信息的文件有更新的時候,就將這個文件發送給系統管理員。現在要實現這個需求就比較簡單了。首先將應用程序的錯誤信息保存在一個特定的文件中。然後利用一個循環語句每隔1個小時或者半個小時(這個時間根據管理員的需要來定義)去檢查一下這個錯誤文件是否有更新。若有更新的話就將這個文件通過郵件或者其他手段發送給系統管理員。管理員也可以在第一時間內知道這個錯誤信息,而不用盯著操作系統去看。
將系統的標准輸出流與錯誤輸出流分開來管理,這是系統管理員采用的一個手段。這不僅在調試腳本程序的時候用得著,而且也有利於跟蹤應用程序的執行情況。如在Linux操作系統上部署了一個數據庫系統。那麼就可以利用以上提到的方式讓操作系統自動匯報數據庫應用程序在運行過程中的錯誤信息。對於管理員來說,只關注這些錯誤信息,一些正常的輸出其就可以忽略不計。在有需要的時候去查看一下即可。
三、將正確信息與錯誤信息都保存在同一個文件中。
除了可以將正確信息與錯誤信息保存在不同的文件中,還可以將它們合並在同一個文件中。要實現這個需求,可以采取兩種途徑。
一是通過文件合並來實現。即先將錯誤信息與正確信息保存在兩個不同的文件中。然後再需要的時候,來利用文件合並的功能將他們合並在同一個文件中。如利用cat命令加上>>重定向符號就可以將兩個文件合並在一起了。注意這裡用的是>>符號而不是>符號。這個命令很容易理解,就是先將某個文件中(如保存錯誤信息的文件)的內容讀出來,然後再通過重定向符號>>(這個符號的含義是追加,而不是替換)將讀出來的錯誤信息追加到另外一個文件中(如保存正確信息的文件)。通過這個方式就可以兩正確信息與錯誤信息合並保存在同一文件中。
二是通過&聯合符號來實現這個需求。既然系統將輸出分為標准輸出流與錯誤輸出流,那麼系統管理員能否把這兩個流合並在一起呢?答案是肯定的。如果系統管理員需要將他們進行合並,則可以利用命令cat >file 1&2來完成。這個命令的含義就是將標准輸出流(參數1表示)與錯誤輸出流(參數2表示)的輸出合並在一起,然後通過重定向符號保存在管理員指定的文件中。
那麼以上兩個解決方案最後得到的文件有什麼差異嗎?如果單從文件的內容上,是沒有差異的。但是在排序上有所區別。第一種方式是在內容已經存在的情況下再對他們進行合並。為此其最後得到的文件錯誤信息與正確信息是分開來存放的。即可能文件的開頭部分是正確輸出,而後面部分則是錯誤信息。而通過聯合的方式來實現合並的話,則其錯誤信息與正確信息都是混合存放在一起的。他是按早信息出現的前後順序來保存記錄,而不是按照信息的類別。由於兩個文件記錄的組織不同,但是內容是相同的。系統管理員可以根據自己的需要與工作習慣,來選擇合適的合並方法。這個兩個結構各有優異。第一種方式將錯誤信息與正確分成前後兩部分,則看其來會更加的明了。但是有一個缺陷,就是缺乏時間上的聯系。系統管理員如果想知道某個錯誤信息前所發生正確輸出內容,以判斷問題可能導致的影響,可能就需要重新組織記錄。而如果采用第二種聯合的方式,其是按照時間先後的順序排列的。此時管理員為要查找錯誤信息,還不得不一條條記錄的去查看或者利用find等命令去查找錯誤信息。所以說,這兩種方式各有優劣,管理員需要根據自己的喜好來選擇合適的方式。有時候甚至需要兩種解決方式並存,來減少維護的工作量。