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

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

目錄

?

??即看即用??

??詳細??

?

??知識鋪墊??

??說明??




即看即用

?

標準輸出:

?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……)

?

【shell】linux輸出重定向_linux

?

詳細

標準輸出(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)調用都通過文件描述符。

【shell】linux輸出重定向_標準輸出_02

如果直接這么講可能有些難以理解,對于 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

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