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

  • 2019 年 10 月 27 日
  • 筆記

了解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刪掉。