當(dāng)前位置:首頁(yè) > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

【shell】linux輸出重定向
2021-09-28 16:58:11

目錄

?

??即看即用??

??詳細(xì)??

?

??知識(shí)鋪墊??

??說(shuō)明??




即看即用

?

標(biāo)準(zhǔn)輸出:

?ls thereisno 1> out.txt? 標(biāo)準(zhǔn)輸出重定向? 也可以不加1寫(xiě)成 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……)

?

【shell】linux輸出重定向_linux

?

詳細(xì)

標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯(cuò)誤(stderr),Stdout的編號(hào)為1,stderr的編號(hào)為2。

默認(rèn)情況下,重定向操作符(如??>??,??|??和??<??)僅適用于stdout的編號(hào)1,(service --status-all |& grep network,??|&??將stdout和stderr一起輸送到右側(cè)標(biāo)準(zhǔn)輸入(stdin)流上的進(jìn)程)

操作符??>??重定向,將stderr(編號(hào)為2)輸出定向到Stdout(編號(hào)為1),使用??descriptor??重定向到其他流,需要在其前面加上??&??(請(qǐng)注意,字符之間不能有空格):2>&1

service --status-all 2>&1 | grep network

?

?

知識(shí)鋪墊

在實(shí)際開(kāi)始前,我們先回顧一點(diǎn) Linux 的知識(shí),對(duì)于 Linux 而言:

一切都是文件

然而為了區(qū)分不同類(lèi)型的事物,我們有了:

  • 普通文件
  • 目錄文件
  • 鏈接文件
  • 設(shè)備文件

其中文件描述符(file descriptor)是內(nèi)核為了高效管理已被打開(kāi)的文件所創(chuàng)建的索引,其值是一個(gè)非負(fù)整數(shù)(通常是小整數(shù)),用于指代被打開(kāi)的文件,所有執(zhí)行 I/O 操作的系統(tǒng)調(diào)用都通過(guò)文件描述符。

【shell】linux輸出重定向_標(biāo)準(zhǔn)輸出_02

如果直接這么講可能有些難以理解,對(duì)于 Linux 有一些使用的用戶(hù)來(lái)說(shuō),會(huì)有類(lèi)似如下的寫(xiě)法:


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 的文件中了)。

?

說(shuō)明

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


那么本文標(biāo)題的語(yǔ)句:

1>/dev/null 首先表示標(biāo)準(zhǔn)輸出重定向到空設(shè)備文件,也就是不輸出任何信息到終端,說(shuō)白了就是不顯示任何信息(將命令的輸出扔棄掉了)。

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寫(xiě)成 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)輸出輸出。

一般來(lái)講標(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)輸出,如果在控制臺(tái)調(diào)試,也就是屏幕上,方便調(diào)試。


?

本文摘自 :https://blog.51cto.com/l

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >