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

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

目錄

?

??即看即用??

??詳細(xì)??

?

??知識鋪墊??

??說明??




即看即用

?

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

?ls thereisno 1> out.txt? 標(biāo)準(zhǔn)輸出重定向? 也可以不加1寫成 ls thereisno > out.txt

標(biāo)準(zhǔn)錯誤:

?ls thereisno 2> out.txt? 標(biāo)準(zhǔn)錯誤重定向

錯誤:

?ls thereisno > out.txt? 2>&1? 把錯誤定向到標(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)錯誤(stderr),Stdout的編號為1,stderr的編號為2。

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

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

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

?

?

知識鋪墊

在實際開始前,我們先回顧一點 Linux 的知識,對于 Linux 而言:

一切都是文件

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

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

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

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

如果直接這么講可能有些難以理解,對于 Linux 有一些使用的用戶來說,會有類似如下的寫法:


g++ lots_of_errors 2>&1 | head


其中??2>&1??中的 2 就是表示的「標(biāo)準(zhǔn)錯誤」,1 就是「標(biāo)準(zhǔn)輸出」,中間的 & 表示后面跟的數(shù)字是文件描述符而不是一個文件(不然所有的「標(biāo)準(zhǔn)錯誤」就都重定向到了一個名為 1 的文件中了)。

?

說明

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


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

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

2>&1 接著,標(biāo)準(zhǔn)錯誤輸出重定向等同于 標(biāo)準(zhǔn)輸出,因為之前標(biāo)準(zhǔn)輸出已經(jīng)重定向到了空設(shè)備文件,所以標(biāo)準(zhǔn)錯誤輸出也重定向到空設(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)錯誤重定向

?ls thereisno > out.txt? 2>&1? 把錯誤定向到標(biāo)準(zhǔn)輸出,然后統(tǒng)一重定向

?ls thereisno &> out.txt? 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)

一般在shell包括dos下都可能會這樣使用。

?

1表示標(biāo)準(zhǔn)輸出,2表示標(biāo)準(zhǔn)錯誤輸出,2>&1表示將標(biāo)準(zhǔn)錯誤輸出重定向到標(biāo)準(zhǔn)輸出,這樣,程序或者命令的正常輸出和錯誤輸出就可以在標(biāo)準(zhǔn)輸出輸出。

一般來講標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出都是屏幕,那為什么還要這么用呢?原因是標(biāo)準(zhǔn)輸出的重定向。你的例子是重定向到了null,如果重定向到文件,例如:

dir > out.txt

表示標(biāo)準(zhǔn)輸出重定向到out.txt文件。此時如果dir命令出錯,那么錯誤信息不會輸出到out.txt文件,錯誤信息仍然會輸出到屏幕——標(biāo)準(zhǔn)錯誤輸出。為了使正確的信息和錯誤的信息都重定向到out.txt文件,那么需要將錯誤信息的標(biāo)準(zhǔn)錯誤輸出重定向到標(biāo)準(zhǔn)輸出。即命令如下:

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,這是個空設(shè)備,也就是忽略其輸出。

2>&1 是將錯誤輸出到標(biāo)準(zhǔn)輸出,如果在控制臺調(diào)試,也就是屏幕上,方便調(diào)試。


?

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

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