/dev/null 代表空裝置檔案
> 代表重定向到哪裡,例如:echo "123" > /home/123.txt
2 表示stderr标準錯誤
& 表示等同于的意思,2>&1,表示2的輸出重定向等同于1
1>/dev/null 首先表示标準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端,說白了就是不顯示任何資訊。
2>&1 接着,标準錯誤輸出重定向等同于 标準輸出,因為之前标準輸出已經重定向到了空裝置檔案,是以标準錯誤輸出也重定向到空裝置檔案。
Linux系統中無論是crontab裡面,還是平時使用的指令,經常會碰到">/dev/null 2>&1"。比如說:在Crontab Job裡面,如果不想發送郵件,那麼有兩種方法:
一、是将MAILTO="", 設定為空
[root@host etc]# cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
二、是将關閉某個指令的輸出結果,将其重定向到/dev/null中。
1 1 * * * /sbin/ping -c 5 www.linuxidc.com > /dev/null 2>&1
1 2 * * * /sbin/ping -c 5 www.linuxidc.com > /dev/null
則第一個crontab,即使ping失敗,都不會有郵件發出,
而第二個crontab,如果ping失敗,會在/var/spool/mail目錄或/var/spool/clientmqueue目錄下生成大量的錯誤輸出提示郵件。
那麼如何了解">/dev/null 2>&1",可以拆開來了解:
> :重定向,例如 echo "Hello" > /root/1.txt
1> stdout:表示标準輸出,預設是1
2> stderr:表示标準錯誤
& :表示等同于,2>&1,表示标準錯誤重定向,等同于标準輸出
/dev/null :表示空設定檔案,類似于Win系統中的垃圾箱
是以,“>/dev/null 2>&1”也可以寫成“1>/dev/null 2>&1”
那麼本文标題的語句執行過程為:
1>/dev/null :首先表示标準輸出重定向到空裝置檔案,就是不顯示任何資訊。
2>&1 :接着,标準錯誤輸出重定向到标準輸出,因為之前标準輸出已經重定向到了空裝置檔案,是以标準錯誤輸出也重定向到空裝置檔案。
比如說:
command > file 2>file
command > file 2>&1
相同點:上面兩個指令都可是實作将執行command後的,标準及錯誤輸出重定向到file檔案中。
不同點: I/O效率上的差異
command 1>file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會被打開兩次,這樣stdout和stderr會互相覆寫,這樣寫相當使用了FD1和FD2兩個同時去搶占file的管道。
command 1>file 2>&1 這條指令就将stdout直接送向file, stderr 繼承了FD1管道後,再被送往file,此時,file隻被打開了一次,也隻使用了一個管道FD1,它包括了stdout和stderr的内容。從I/O效率上,前一條指令的效率要比後面一條的指令效率要低,是以在編寫shell腳本的時候,最多的時候我們會command 1>file 2>&1 這樣的寫法, 或 "command >file 2&1"
本文轉自yzy121403725 51CTO部落格,原文連結:http://blog.51cto.com/lookingdream/1794991,如需轉載請自行聯系原作者