目錄
?
??即看即用??
??詳細??
?
??知識鋪墊??
??說明??
?
標準輸出:
?ls thereisno 1> out.txt? 標準輸出重定向? 也可以不加1寫成 ls thereisno > out.txt
標準錯誤:
?ls thereisno 2> out.txt? 標準錯誤重定向
錯誤:
?ls thereisno > out.txt? 2>&1? 把錯誤定向到標準輸出,然后統(tǒng)一重定向
?所有IO:
ls thereisno &> out.txt? 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)
?
?
詳細標準輸出(stdout)和標準錯誤(stderr),Stdout的編號為1,stderr的編號為2。
默認情況下,重定向操作符(如??>?
?,??|?
?和??<?
?)僅適用于stdout的編號1,(service --status-all |& grep network,??|&?
?將stdout和stderr一起輸送到右側標準輸入(stdin)流上的進程)
操作符??>?
?重定向,將stderr(編號為2)輸出定向到Stdout(編號為1),使用??descriptor??重定向到其他流,需要在其前面加上??&?
?(請注意,字符之間不能有空格):2>&1
service --status-all 2>&1 | grep network
?
?
知識鋪墊
在實際開始前,我們先回顧一點 Linux 的知識,對于 Linux 而言:
一切都是文件
然而為了區(qū)分不同類型的事物,我們有了:
- 普通文件
- 目錄文件
- 鏈接文件
- 設備文件
其中文件描述符(file descriptor)是內核為了高效管理已被打開的文件所創(chuàng)建的索引,其值是一個非負整數(shù)(通常是小整數(shù)),用于指代被打開的文件,所有執(zhí)行 I/O 操作的系統(tǒng)調用都通過文件描述符。
如果直接這么講可能有些難以理解,對于 Linux 有一些使用的用戶來說,會有類似如下的寫法:
g++ lots_of_errors 2>&1 | head
其中??2>&1?
?中的 2 就是表示的「標準錯誤」,1 就是「標準輸出」,中間的 & 表示后面跟的數(shù)字是文件描述符而不是一個文件(不然所有的「標準錯誤」就都重定向到了一個名為 1 的文件中了)。
?
說明
1>/dev/null 2>&1的含義
那么本文標題的語句:
1>/dev/null 首先表示標準輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息(將命令的輸出扔棄掉了)。
2>&1 接著,標準錯誤輸出重定向等同于 標準輸出,因為之前標準輸出已經(jīng)重定向到了空設備文件,所以標準錯誤輸出也重定向到空設備文件。
2>&1 和 &>? 的解釋
?ls thereisno 1> out.txt? 標準輸出重定向? 也可以不加1寫成 ls thereisno > out.txt
?ls thereisno 2> out.txt? 標準錯誤重定向
?ls thereisno > out.txt? 2>&1? 把錯誤定向到標準輸出,然后統(tǒng)一重定向
?ls thereisno &> out.txt? 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)
一般在shell包括dos下都可能會這樣使用。
?
1表示標準輸出,2表示標準錯誤輸出,2>&1表示將標準錯誤輸出重定向到標準輸出,這樣,程序或者命令的正常輸出和錯誤輸出就可以在標準輸出輸出。
一般來講標準輸出和標準錯誤輸出都是屏幕,那為什么還要這么用呢?原因是標準輸出的重定向。你的例子是重定向到了null,如果重定向到文件,例如:
dir > out.txt
表示標準輸出重定向到out.txt文件。此時如果dir命令出錯,那么錯誤信息不會輸出到out.txt文件,錯誤信息仍然會輸出到屏幕——標準錯誤輸出。為了使正確的信息和錯誤的信息都重定向到out.txt文件,那么需要將錯誤信息的標準錯誤輸出重定向到標準輸出。即命令如下:
dir > out.txt 2>&1
重定向到null是一個道理。
dir > null 2>&1
?
os.system("/etc/init.d/winbind stop >/dev/null 2>&1")
>/dev/null 將輸出重定向到/dev/null,這是個空設備,也就是忽略其輸出。
2>&1 是將錯誤輸出到標準輸出,如果在控制臺調試,也就是屏幕上,方便調試。
?
本文摘自 :https://blog.51cto.com/l