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文件中。
不同點: 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"
Linux中利用crontab創建計劃任務 http://www.linuxidc.com//Linux/2013-06/86401.htm
Linux中用crontab例行工作安排 http://www.linuxidc.com//Linux/2013-06/85441.htm
Linux crontab不執行問題排查 http://www.linuxidc.com//Linux/2013-06/85432.htm
Ubuntu使用crontab定時任務 http://www.linuxidc.com//Linux/2013-05/84770.htm
Linux計劃任務(at batch crontab anacron) http://www.linuxidc.com//Linux/2013-03/81584.htm