您好,登錄后才能下訂單哦!
這篇文章主要介紹Linux Bash Shell命令重導向的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
命令重導向
基本上,這個子題是 Linux Bash Shell命令重導向 相當重要的觀念,這里可得花點心思才行呦!
o 什么是『重導向, redirect ?』:簡單的說,就是將你目前的所得資料轉到其他地方去就是了!例如我們常用的,將目前的螢幕輸出資料轉到檔案中去,就可以這么寫:『ls -l / > test 』,那個大于的符號『 > 』就是將輸出結果導向到 test 這個檔案中的意思啰!這個時候:
§ 如果你執行『 ls -l / 』而已的話,螢幕會將根目錄的檔案與目錄都列出在螢幕上;
§ 但是當使用 > 導向到 test 這個檔案中時,則螢幕不會顯示任何訊息,但是會將剛剛你執行的結果輸出到 test 這個檔案中。
所以啰,你只要『 vi test 』一下,就會知道 test 這個檔案中記錄了剛剛我們執行的資料結果啰!不過,這里需要特別留意的是,當你使用 > 符號將資料由螢幕導向到檔案中時,則:
§ 該檔案(就是 test )若不存在,系統會自動的將他建立起來,但是,
§ 當這個檔案存在的時候,那么系統就會先將這個檔案內容清空,然后再將資料寫入!
§ 也就是若以 > 輸出到一個既存檔案中,呵呵,那個檔案就會被覆蓋掉啰!
除了這個 > 的符號之外,在 bash 命令執行的過程中,主要有三種輸出入的狀況,分別是:
1. 標準輸入;代碼為 0 ;或稱為 stdin ;使用的方式為 <
2. 標準輸出:代碼為 1 ;或稱為 stdout;使用的方式為 1>
3. 錯誤輸出:代碼為 2 ;或稱為 stderr;使用的方式為 2>
注意了!那個 1> 與 2> 之間并沒有空白字元!而相關的使用說明可以舉例如下
[test @test test]# ls -al >list.txt<==將顯示的結果輸出到 list.txt 檔案中,若該檔案以存在則予以取代! [test @test test]# ls -al >> list.txt <==將顯示的結果累加到 list.txt 檔案中,該檔案為累加的,舊資料保留! [test @test test]# ls -al 1> list.txt 2> list.err <==將顯示的資料,正確的輸出到 list.txt 錯誤的資料輸出到 list.err [test @test test]# ls -al 1> list.txt 2>&1 <==將顯示的資料,不論正確或錯誤均輸出到 list.txt 當中! [test @test test]# ls -al 1> list.txt 2> /dev/null<==將顯示的資料,正確的輸出到 list.txt 錯誤的資料則予以丟棄!注意!錯誤與正確檔案輸出到同一個檔案中,則必須以上面的方法來寫!不能寫成其他格式!
這個觀念相當的重要,尤其是在 /etc/crontab 當中執行的時候,如果我們已經知道錯誤的訊息為何,又不想要讓錯誤的訊息一直填滿 root 的信箱,就必須以 2> 搭配 /dev/null 這個垃圾桶黑洞裝置,來將資料丟棄!這個相當的重要!
這里我們來說明一下命令重導向里面幾個常用的符號與裝置:
o <:由 < 的右邊讀入參數檔案;
o >:將原本由螢幕輸出的正確資料輸出到 > 右邊的 file ( 檔案名稱 ) 或 device ( 裝置,如 printer )去;
o >> :將原本由螢幕輸出的正確資料輸出到 >> 右邊,與 > 不同的是,該檔案將不會被覆蓋,而新的資料將以『增加的方式』增加到該檔案的***面;
o 2> :將原本應該由螢幕輸出的錯誤資料輸出到 2> 的右邊去。
o /dev/null :可以說成是黑洞裝置!
好了,對于『 > , >> 』這兩個東西有一定的概念之后,我們來深入的談一談『命令輸出重導向』的觀念吧!如前所述,基本上, Linux 執行的結果中,可以約略的分成『正確輸出』與『錯誤輸出』兩種方式。例如,當你以一般身份執行 find 這個指令時,例如執行『 find / -name testing 』時,由于你是一般身份,又有些資料夾是不允許一般身份者進入的,所以啰,當你使用 find 時,就會有錯誤訊息發生了!但同時如果有 testing 這個檔案在你可以進入的資料夾當中,那么螢幕也會輸出到給你看!因此,就具有正確的與錯誤的輸出兩種啰!(分別稱為 Stdout 與 Stderror)例如下面為執行結果:里面的『 find: /home/root: Permission denied 』就告訴你該資料夾你沒有權限進入,這就是錯誤的輸出了,那么『 /home/test/tseting 』就是正確的輸出了!
[test @test test]# find / -name testing find: /home/test1: Permission denied<==這是錯誤的輸出 find: /home/root: Permission denied <==這是錯誤的輸出 find: /home/masda: Permission denied<==這是錯誤的輸出 /home/test/testing<==這是『正確』的輸出 [test @test test]#
好了,那么假如我們想要將資料輸出到 list 這個檔案中呢?執行『 find / -name testing > list 』會有什么結果?呵呵,你會發現 list 里面存了剛剛那個『正確』的輸出資料,至于螢幕上還是會有錯誤的訊息出現呢!傷腦筋!如果想要將正確的與錯誤的資料分別存入不同的檔案中需要怎么做?!呵呵!其實在資料的重導向方面,正確的寫法應該是『 1> 』與『 2> 』才對!但是如果只有 > 則預設是以 1> 來進行資料的!那個 1> 是輸出正確資料, 2> 則是錯誤資料輸出項目。也就是說:
· 1> :是將正確的資料輸出到指定的地方去
· 2> :是將錯誤的資料輸出到指定的地方去
好了,那么上面的例子中,我們如何將資料輸出到不同的地方去呢?可以這么寫:
[test @test test]# find / -name testing 1> list_right 2> list_error
這樣一來,剛剛執行的結果中,有 Permission 的那幾行錯誤資訊都會跑到 list_error 這個檔案中,至于正確的輸出資料則會存到 list_right 這個檔案中啰!這樣可以了解了嗎?如果有點混亂的話,去休息一下再來看看吧!!
再來,如果我只要正確的資料,錯誤的資訊我不要了呢?呵呵,這個時候 /dev/null 這個垃圾桶就很重要了!/dev/null 是什么呢?基本上,那就有點像是一個『黑洞』的垃圾桶功能!當你輸入的任何東西導向到這個虛擬的垃圾桶裝置時,『他就會憑空消失不見了~~』,這個東西有用的很!例如上面的例子中,我們可以這么做,來將錯誤的資訊丟掉!
[test @test test]# find / -name testing 1> list_right 2> /dev/null
很神奇呦! error message 就會『不見了!』呵呵!真高興!另外,如果我要將資料都寫到同一個檔案中呢?這個時候寫法需要用到特殊寫法,請注意底下的寫法呦!
[test @test test]# find / -name testing 1> list 2> list<==錯誤寫法 [test @test tset]# find / -name testing 1> list 2>&1 <==正確寫法
請特別留意這一點呢!同時寫入同一個檔案需要使用 2>&1 才對呦!
OK!了解了 >, 2>, >> 與 /dev/null 之后,那么那個 < 又是什么呀!?呵呵!以最簡單的說法來說,那就是『將原本需要由鍵盤輸入的資料,經由檔案來讀入』的意思,最明顯的例子就是 mail 這個東西了!我們以 root 的身份來寄信給 root 好了,可以這樣做:
1. 完全由鍵盤輸入資料: [root @test test]# mail -s "test" root<== -s 表示標題, root 為收件者 I am root!<==以下的資料都是由鍵盤輸入的 That's OK . <==要結束鍵盤的輸入時,需要在一行的最前面加上 . 即可! CC.<==是否需要有密件副本?不需要的話,直接按下 Enter ! EOF<==表示送出的提示字元而已! 2. 由檔案代替輸入 [test @test tset]# mail -s "test" root < /root/.bashrc <==將 .bashrc 內容寄給 root !
很有趣吧! ^_^ 這樣就可以將信寄出去啰!所以說,熟悉命令重導像的話,對您可是相當的有幫助的呦!
好了,那么為何要使用命令輸出重導向呢?這個問題一定會困擾你一下下的,如果你從來都沒有寫過 script 的話!好了,我們來說一說吧!
o 當螢幕輸出的資訊很重要,而且我們需要將他存下來的時候;
o 背景執行中的程式,不希望他干擾螢幕正常的輸出結果時;
o 一些系統的例行命令(例如寫在 /etc/crontab 中的檔案)的執行結果,希望他可以存下來時;
o 一些執行命令,我們已經知道他可能的錯誤訊息,所以想以『 2> /dev/null 』將他丟掉時;
o 錯誤訊息與正確訊息需要分別輸出時。
當然還有很多很多的功能的,最簡單的就是網友們常常問到的:『為何我的 root 都會收到系統 crontab 寄來的錯誤訊息呢』這個咚咚是常見的錯誤,而如果我們已經知道這個錯誤訊息是可以忽略的時候,嗯!『 2> errorfile 』這個功能就很重要了吧!了解了嗎??
以上是“Linux Bash Shell命令重導向的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。