天天看點

2>&1 >/dev/null & 與/dev/null 2>&1含義

/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,如需轉載請自行聯系原作者