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