【Linux】資料流重導向(後篇)

weixin_34262482發表於2014-05-13

  1)/dev/null 垃圾桶黑洞裝置與特殊寫法

  想象一下,如果我知道錯誤資訊會發生,所以要將錯誤資訊忽略掉而不顯示或儲存呢? 這個時候黑洞裝置 /dev/null 就很重要了!這個 /dev/null 可以吃掉任何導向這個裝置的資訊喔!將上述的範例修訂一下:

範例四:承範例三,將錯誤的資料丟棄,螢幕上顯示正確的資料
[dmtsai@www ~]$ find /home -name .bashrc 2> /dev/null
/home/dmtsai/.bashrc  <==只有 stdout 會顯示到螢幕上, stderr 被丟棄了

  再想象一下,如果我要將正確與錯誤資料通通寫入同一個檔案去呢?這個時候就得要使用特殊的寫法了! 我們同樣用底下的案例來說明:

範例五:將命令的資料全部寫入名為 list 的檔案中
[dmtsai@www ~]$ find /home -name .bashrc > list 2> list  <==錯誤
[dmtsai@www ~]$ find /home -name .bashrc > list 2>&1     <==正確
[dmtsai@www ~]$ find /home -name .bashrc &> list         <==正確

  上述表格第一行錯誤的原因是,由於兩股資料同時寫入一個檔案,又沒有使用特殊的語法, 此時兩股資料可能會交叉寫入該檔案內,造成次序的錯亂。所以雖然最終 list 檔案還是會產生,但是裡面的資料排列就會怪怪的,而不是原本螢幕上的輸出排序。 至於寫入同一個檔案的特殊語法如上表所示,你可以使用 2>&1 也可以使用 &> ! 

  2)standard input : < 與 <<

  瞭解了 stderr 與 stdout 後,那麼那個 < 又是什麼呀?呵呵!以最簡單的說法來說, 那就是『將原本需要由鍵盤輸入的資料,改由檔案內容來取代』的意思。 我們先由底下的 cat 命令操作來了解一下什麼叫做『鍵盤輸入』吧!

範例六:利用 cat 命令來建立一個檔案的簡單流程
[root@www ~]# cat > catfile
testing
cat file test
<==這裡按下 [ctrl]+d 來離開

[root@www ~]# cat catfile
testing
cat file test

  由於加入 > 在 cat 後,所以那個 catfile 會被主動的建立,而內容就是剛剛鍵盤上面輸入的那兩行資料了。 唔!那我能不能用純文字檔案取代鍵盤的輸入,也就是說,用某個檔案的內容來取代鍵盤的敲擊呢? 可以的!如下所示:

範例七:用 stdin 取代鍵盤的輸入以建立新檔案的簡單流程
[root@www ~]# cat > catfile < ~/.bashrc
[root@www ~]# ll catfile ~/.bashrc
-rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc
-rw-r--r-- 1 root root 194 Feb  6 18:29 catfile
# 注意看,這兩個檔案的大小會一模一樣!幾乎像是使用 cp 來複制一般!

  這東西非常的有幫助!尤其是用在類似 mail 這種命令的使用上。 理解 < 之後,再來則是怪可怕一把的 << 這個連續兩個小於的符號了。 他代表的是『結束的輸入字元』的意思!舉例來講:『我要用 cat 直接將輸入的資訊輸出到 catfile 中, 且當由鍵盤輸入 eof 時,該次輸入就結束』,那我可以這樣做:

[root@www ~]# cat > catfile << "eof"
> This is a test.
> OK now stop
> eof  <==輸入這關鍵詞,立刻就結束而不需要輸入 [ctrl]+d

[root@www ~]# cat catfile
This is a test.
OK now stop     <==只有這兩行,不會存在關鍵詞那一行!

  看到了嗎?利用 << 右側的控制字元,我們可以終止一次輸入, 而不必輸入 [crtl]+d 來結束哩!這對程式寫作很有幫助喔!好了,那麼為何要使用命令輸出重導向呢?我們來說一說吧!

  • 螢幕輸出的資訊很重要,而且我們需要將他存下來的時候;
  • 背景執行中的程式,不希望他干擾螢幕正常的輸出結果時;
  • 一些系統的例行命令 (例如寫在 /etc/crontab 中的檔案) 的執行結果,希望他可以存下來時;
  • 一些執行命令的可能已知錯誤資訊時,想以『 2> /dev/null 』將他丟掉時;
  • 錯誤資訊與正確資訊需要分別輸出時。

  當然還有很多的功能的,最簡單的就是常常問到的:『為何我的 root 都會收到系統 crontab 寄來的錯誤資訊呢』這個咚咚是常見的錯誤, 而如果我們已經知道這個錯誤資訊是可以忽略的時候,嗯!『 2> errorfile 』這個功能就很重要了吧! 瞭解了嗎?

  參考資料:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash.php#redirect

相關文章