1. 程式人生 > >liunux中的標準輸出。以及常用的 2>dev/null 命令的含義

liunux中的標準輸出。以及常用的 2>dev/null 命令的含義

瞭解Linux怎樣處理輸入和輸出是非常重要的。一旦我們瞭解其原理以後,我們就可以正確熟練地使用指令碼把內容輸出到正確的位置。同樣我們也可以更好地理解輸入重定向和輸出重定向。

首先我們來了解一下linux中的檔案描述符:

Linux系統將所有裝置都當作檔案來處理,而Linux用檔案描述符來標識每個檔案物件。其實我們可以想象我們電腦的顯示器和鍵盤在Linux系統中都被看作是檔案,而它們都有相應的檔案描述符與之對應。

Linux系統預留可三個檔案描述符:0、1和2,他們的意義如下所示:

0——標準輸入(stdin)

1——標準輸出(stdout)

2——標準錯誤(stderr)

 

標準輸如(STDIN):

其實我們與計算機之間的互動是我可以輸入一些指令之後它給我一些輸出。那麼我們可以把上面表格中的檔案描述符0理解為我和計算機互動時的輸入,而這個輸入預設是指向鍵盤的。這個先不多說,先說下標準輸出。

標準輸出(STDOUT):

檔案描述符1理解為我和計算機互動時的輸出,而這個輸出預設是指向顯示器的

例項:假設在當前資料夾中有且只有一個檔案laowang.txt,這時我們執行這個命令【ls laowang.txt】,就會獲得一個標準輸出stdout的輸出結果:laowang.txt

root@wangjielin:~# ls laowang.txt
laowang.txt

就像我上面說的那樣,既然它們是預設的,我就可以更改它們。下面的命令就是把標準輸出的位置改到laowang.txt檔案中:

exec 1> laowang.txt

如果我輸入ls -al 或者ps命令,我們的終端將不會顯示任何東西。現在,我們可以新開一個終端檢視xlinsist這個檔案中是否有上面兩個命令所顯示的內容。注意:你必須新開一個終端。

# 在原先的中斷中輸入ls laowang.txt兩次,終端都沒有列印內容。重新開啟一個終端檢視laowang.txt的內容如下
root@wangjielin:~# cat laowang.txt 
laowang.txt
laowang.txt

但是這個指令,只在當前終端適用。當你重新開啟一個終端,標準輸出任然是列印到終端。

再返回頭說下標準輸入:

root@wangjielin:~# read user
laowang
root@wangjielin:~# echo $user
laowang

這兩句命令的意思是,我們把從鍵盤輸入的laowang讀入到user變數。這個read需要我輸入。現在,我要改變標準輸入的預設位置:

#只是把當前的標準輸出重定向到test檔案中
root@wangjielin:~# echo 'laowang' 1>test root@wangjielin:~# cat test laowang
#只是把當前的標準輸入重定向到test檔案中 root@wangjielin:~# read user1 0<test root@wangjielin:~# echo $user1 laowang

標準錯誤:

標準錯誤輸出和標準輸出的區別是,它在命令出錯情況下的輸出。這沒有什麼太大的不同,我們也可以把它的輸出修改到任何我們想要的位置。只不過我們需要把上面標準輸出的1改成2,命令如下:

exec 2>laowang.txt

這樣錯誤的輸出就會重定向到laowang.txt中

 

比較有趣的是:除了0, 1,2以外,我們可以分配自己的檔案描述符。看下面的例子:

root@wangjielin:~# exec 6>laowang.txt
root@wangjielin:~# echo 'l love the world' 1>&6
root@wangjielin:~# cat laowang
cat: laowang: No such file or directory
root@wangjielin:~# cat laowang.txt 
l love the world

上面的命令很有意思:我首先把檔案描述符6指向test檔案。因為不像描述符1,所有的輸出都會自然找它,然後看它是定向到顯示器還是某個檔案。所以當我們想找描述符6的時候我們要用&來引用它。其實我們可以把檔案描述符想像成一個檔案的引用,它可以指向任何一個檔案(包括顯示器),指向的過程就是我們修改預設位置的過程。而用&符號來找到它指向的目標檔案,從而向其寫入資料。

 

來測試下,看個複雜點的例子:

exec 3>&1
exec 1>test
echo "這句話被存到test檔案中"
echo "還有這句"
exec 1>&3
echo "這句話輸出到顯示器"

解題:首先檔案描述符1預設指向的是顯示器,用&來找到檔案描述符1指向的目標檔案,也就是顯示器。因此檔案描述符3也指向了顯示器。然後,我們修改了檔案描述符1指向的檔案到test檔案。接著兩個echo命令的輸出會自然去找檔案描述符1,然後它看到檔案描述符1指向的是test檔案,所以它會把輸出寫到test檔案中。最後,我們用&來找到檔案描述符3指向的目標檔案,也就是顯示器,然後我們修改了檔案描述符1指向的檔案到顯示器。因此,最後一個echo命令會自然的找檔案描述符1然後輸出到顯示器上。

來嘛,進入第二個主題:2>dev/null  

學習了上邊的內容,對於這個也就不難理解了。就是把標註錯誤重定向到/dev/null中

值得注意的是:/dev/null是一個特殊的裝置檔案,這個檔案接收到任何資料都會被丟棄。因此,null這個裝置通常也被稱為位桶(bit bucket)或黑洞。

所以,2>/dev/null的意思就是將標準錯誤stderr刪掉。

 最後再推薦一個命令:

tee命令 – 從標準輸入讀取,寫到標準輸出和檔案。

# 把date產生的輸出寫到標準輸出和檔案
date | tee test.txt
# 追加資料
date | tee -a test.txt

&n