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