九:輸入與輸出,重定向

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

          標(biāo)準(zhǔn)輸出:


          標(biāo)準(zhǔn)錯誤:


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

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

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

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

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

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

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

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

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

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

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

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

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

          Xwindow:


          Shell:


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

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

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

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

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

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

          導(dǎo)航

          統(tǒng)計

          公告

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

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 潮州市| 林州市| 革吉县| 惠东县| 沙雅县| 岑溪市| 佛坪县| 定远县| 新和县| 托克托县| 西畴县| 碌曲县| 无为县| 揭西县| 西昌市| 营山县| 法库县| 澄迈县| 凭祥市| 延川县| 那曲县| 武鸣县| 南陵县| 永清县| 林芝县| 奉节县| 青浦区| 大关县| 乐平市| 新竹市| 当阳市| 专栏| 左贡县| 柳林县| 汝州市| 巴彦县| 云安县| 迭部县| 中卫市| 青浦区| 辽阳县|