九:輸入與輸出,重定向

          目前我們用到的大多數命令都是有輸入和輸出的,這不難理解,一個命令可能需要得到一個用戶指定的參數去執行,然后把執行的結果反饋給用戶。當然,這個命令可能不需要人為的指定要輸入的參數,會自帶默認的參數,比如:pwd;也許,命令給出的信息不是理想的結果,比如ls一個不存在的目錄或者文件,命令給出了錯誤提示。
          以上種種,都是程序所涉及的輸入與輸出常見途徑。就輸入而言,很多程序都從一個叫標準輸入的設備得到輸入信息,不難想到,這個設備就是我們的鍵盤,命令行下大多數操作都是通過鍵盤完成。而輸出分為兩種,標準輸出和標準錯誤,通常,這兩個輸出都會直接連接到屏幕,而不是保存到磁盤文件

          標準輸出:


          標準錯誤:


          重定向,就是允許我們自己重新確定輸入和輸出信息的流向。
          要實現重定向,我們需要用到重定向符“>”,這個符號很形象,像沙漏一樣,可以理解為從什么到什么。
          以往,我們使用“ls -l /”,會將程序的結果輸出到屏幕上,現在,我們使用重定向,將這個結果保存到一個文件中。“ls -l / > /testls.txt”,使用“>”,把程序的輸出結果,從標準輸出(屏幕)重定向到指定的文件。

          *之前提到過,“touch”命令是新建文件的一種手段,現在,我們知道了幫助命令,我們可以得知,“touch”命令的本來作用是更新目標文件的訪問和修改時間為當前時間,當目標文件不存在時才會新建一個以目標文件命名的文件,在重定向中,我們指定的重定向目標文件不存在時,也會新建一個文件。這也是新增文件的一種手段。可以說,當有輸出發生的時候,目標文件不存在,那么會新增一個文件。

          文件查看命令:cat
          cat命令的作用是連接到一個文件,并把文件內容輸出到標準輸出
          好了,我們查看一下剛才重定向的文件
          示例:cat /testls.txt
          呃,并沒有高亮顯示來區別文件內容,畢竟不是“ls”命令有高亮顯示,保存的只是純文本信息。

          我們再嘗試一下重定向錯誤信息到testls.txt文件

          文件之前保存的內容也不見了!之所以會這樣,是因為我們只指定了標準輸出的重定向,但是標準輸出因為錯誤而中斷了(目標文件不存在,所以壓根沒有輸出),所以標準輸出沒有任何內容。

          *所以直接使用重定向符號“> something.txt”會直接創建一個空文件,或者清空同名文件的內容

          重定向追加操作符“>>”
          當我們把“ls -l / > /testls.txt”改為“ls -l / >> /testls.txt”,那么意味著,如果目標文件不存在,會新建一個目標文件,并將標準輸出輸出到該文件,如果存在,那么會將標準輸出追加到該文件的尾部。

          重定向標準錯誤
          為了能使用重定向錯誤,我們需要先知道,Linux在執行一個程序的時候會打開多個流,我們把前三個看做標準輸入,標準輸出,標準錯誤,他們在shell中有各自的文件描述符(可以理解為流編號),分別是0,1,2,當我們使用“>”重定向標準輸出時,我們實際上是重定向了文件描述符為1的流,也就是說
          “ls . > a.txt”等同于”ls . 1> a.txt”

          那么重定向標準錯誤也就是
          “ls null 2> a.txt”
          假定null是一個不存在的文件,命令執行之后,產生的錯誤信息會重定向到你指定的文件。

          還可以使用“>&”(或者“&>”)來把標準輸出和標準錯誤都重定向到一個位置
          “ls null >& a.txt”

          這樣,兩種輸出信息都會寫到a.txt中。這是一種聯合的寫法,可以更具體去寫
          “ls null > a.txt 2>&1“重定向標準輸出到a.txt文件,然后重定向標準錯誤到標準輸出。這里要注意順序,需要先重定向標準輸出,再重定向標準錯誤,如果順序反過來,那么標準錯誤會重定向到屏幕。

          為了能更好的了解這些數字所對應輸入輸出的關系,我們進一步來說明一下。在Linux中,一切皆文件,設備也是如此,我們查看一下設備掛載點

          其中我們看到,有stderr,stdin,stdout三個軟連接,他們分別指向了proc掛載點下的三個文件,在這里,我們其實已經能找到文件描述符和輸入輸出的對應關系,文件描述符0,1,2都指向了同一個設備/dev/pts/0,這個設備中前三個流我們使用文件描述符0,1,2來規定為標準輸入,輸出和錯誤。這里額外說一句,為什么文件描述符會指向/dev/pts/0這個設備呢,因為演示的時候是使用的裝有Xwindow圖形界面的Linux,我們是在使用一個叫終端控制臺的東西在和shell進行交互,在這種情況下,/dev/pts/n(n代表序號,0代表當前終端,1代表第一個,2代表第二個,以此類推)是在Xwindow模式下的偽終端。如果在純Shell環境下,我們使用的設備將不是/dev/pts/n,而是/dev/tty1。關于終端的更多信息,可以自行查閱。

          Xwindow:


          Shell:


          重定向標準輸入
          剛才我們使用了cat命令,cat命令的標準輸入是什么呢?之前我們指定了一個文件作為cat命令的標準輸入,倘若不指定文件呢?

          我們發現命令行正在等待我們的輸入,是的,我們沒有指定文件作為cat的標準輸入,所以cat就查找默認的標準輸入:鍵盤,我們輸入一段字符,按下“ctrl+d”來通知cat已經完成寫入,按下回車,我們剛才鍵入的文字出現在了屏幕上。
          好了,重定向的功能已經實現了,不是么,但是這里我們并沒有使用重定向符號”>”,對于cat命令,我們可以
          cat < someText.txt 來重定向cat的標準輸入
          *”<“和“>”,還有”>>”都可以重定向

          Linux里的黑洞,神話中的貔貅,/dev/null文件
          我想已經能夠很清楚的描述/dev/null的作用了,首先/dev/null是一個文件,通過文獻,也可以得知他叫“位存儲桶”,他能處理掉任何寫入他的信息,換言之,寫入后不作任何處理。如果我們重定向輸出到位存儲桶,那么他既不會存儲,也不會輸出,但是會提示寫入成功。用來處理異常信息是個不錯的選擇。

          連接命令間的輸入與輸出,管道線
          管道線,寫作“|”,對,很形象,作用也很形象,就是連接命令之間的輸入和輸出。
          示例:
          “ls -l / | cat”,加不加管道線聯合cat都會在屏幕上輸出,雖然在這里,管道線看上去沒什么作用,但是再看下面這個例子
          “ps -ef|grep XXX”,簡而言之就是,找到我們所需的進程,ps命令執行之后會在屏幕上展示當前所有進程,通過管道線,將這個輸出作為grep命令的輸入,找到匹配我們給定字符的行并在屏幕上展示

          posted on 2015-06-27 15:24 都較瘦 閱讀(165) 評論(0)  編輯  收藏 所屬分類: Linux

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          公告

          博客定位:囿于目前的水平,博客定位在記錄自己的學習心得和隨手的練習

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 汝阳县| 新乡县| 永修县| 桐庐县| 马公市| 含山县| 洛扎县| 卢湾区| 遂川县| 浏阳市| 荣昌县| 资源县| 吉隆县| 营山县| 衡阳市| 宜阳县| 界首市| 密云县| 抚松县| 盘锦市| 大同县| 庆安县| 台南市| 云浮市| 巴林左旗| 万山特区| 泸定县| 曲阜市| 安平县| 安宁市| 定襄县| 民县| 香港| 克什克腾旗| 集安市| 东乡县| 鹿邑县| 石泉县| 泸水县| 梁河县| 射洪县|