Linux中 2 1 的含義

2022-07-23 13:48:56 字數 3779 閱讀 8010

平時寫shell指令碼時經常見到命令或者定時任務的後面跟著2>&1的寫法,舉個例子大概如下面這樣

定時任務中

0 */1 * * * root /bin/sh /opt/log_clear.sh >/dev/null

2>&1

普通shell指令碼中

yuminstall -y mariadb-galera-server mariadb-client rsync >install.log 2>&1

echo

'net.ipv4.ip_forward = 1

' >>/etc/sysctl.conf >/dev/null

2>&1

這個 /dev/null 不用多說了,相當於乙個黑洞,linux的所有資料進去後都會被直接丟棄,從裡面讀也不會讀出任何資料,如果希望執行某個命令,但又不希望在螢幕上顯示輸出結果,那麼可以將輸出重定向到 /dev/null

解釋後面的2>&1的之前,先說linux的三個輸入輸出標準,0 通常指標準輸入(stdin),1 是標準輸出(stdout),2 是標準錯誤輸出(stderr),上面2>&1中的2和1就是分別對應著標準錯誤輸出(stderr)和標準輸出(stdout),而 >& 是乙個符號,不能拆開,意思是合併兩個輸出檔案,所以2>&1的含義就是將標準錯誤輸出合併到標準輸出

舉個例子驗證一下

[root@proxynode tomcat]# ls

//目錄下原來有兩個檔案

readme.txt tomcat.tar

.gz[root@proxynode tomcat]#

[root@proxynode tomcat]#

ls >a //

查詢檔案將結果重定向到a裡面,下面命令可以看到a裡面有正確的內容

[root@proxynode tomcat]# cataa

readme.txt

tomcat.

tar.gz

[root@proxynode tomcat]#

rm -f a

[root@proxynode tomcat]#

[root@proxynode tomcat]#

ls1>a //這裡

可以看到加了1和上面不加1效果一樣,因為這裡1就是標準輸出的意思

[root@proxynode tomcat]# cataa

readme.txt

tomcat.

tar.gz

[root@proxynode tomcat]#

rm -f a

[root@proxynode tomcat]#

[root@proxynode tomcat]#

ls2>a //

將錯誤重定向到a裡面,可以看到a是空的,因為沒有錯誤資訊,標準資訊沒指定直接輸出到控制台了

a readme.txt tomcat.tar

.gz[root@proxynode tomcat]#

[root@proxynode tomcat]#

cata

[root@proxynode tomcat]#

再來看關於錯誤輸出的和最終組合的結果

[root@proxynode tomcat]# ls

readme.txt tomcat.

tar.gz

[root@proxynode tomcat]#

ls test //

test檔案不存在所以報錯了,沒指定輸出直接控制台輸出

ls: cannot access test: no such file

or directory

[root@proxynode tomcat]#

[root@proxynode tomcat]#

[root@proxynode tomcat]# ls test >a  //這個是只將正確資訊重定向,錯誤資訊還是控制台直接輸出了

ls: cannot access test: no such file or directory

[root@proxynode tomcat]# cat a     //上面命令會報錯,所以檔案裡是空的

[root@proxynode tomcat]# rm -f a

[root@proxynode tomcat]#

[root@proxynode tomcat]# 

ls test 2>a //

指定錯誤資訊重定向到a,下面看到a的內容包含了錯誤資訊

[root@proxynode tomcat]# cat

als: cannot access test: no such file

or directory

[root@proxynode tomcat]#

[root@proxynode tomcat]#

rm -f a

[root@proxynode tomcat]#

[root@proxynode tomcat]#

ls test >a 2>&1

//看最終2>&1組合,輸出錯誤資訊

[root@proxynode tomcat]# cat

als: cannot access test: no such file

or directory

[root@proxynode tomcat]#

[root@proxynode tomcat]#

rm -f a

[root@proxynode tomcat]#

[root@proxynode tomcat]#

ls >a 2>&1

//看最終2>&1組合,輸出正確資訊

[root@proxynode tomcat]# cat a //

通過這兩個組合可以看出來,加上2>&1後,不管是正確資訊還是錯誤資訊,都被重定向到了a中,跟我們上面解釋的概念一樣

areadme.txt

tomcat.

tar.gz

[root@proxynode tomcat]#

最後簡單再說明一下整個過程,例如這個命令

以下面這個命令為例 

yuminstall -y mariadb-galera-server >/dev/null

2>&1

執行前一部分yum

install -y mariadb-galera-server的時候,會把結果輸出到控制台

後面到了》/dev/null之後,即1>/dev/null,把標準輸出的結果重定向到了/dev/null中丟棄了

在執行到後一段2>&1時,2和1也合併了,上面1已經丟棄了這樣2的異常資訊也就跟丟棄了,控制台上不會顯示任何結果

最後貼個linux輸入輸出重定向的命令

command > file

將輸出重定向到 file。

command < file

將輸入重定向到 file。

command >> file

將輸出以追加的方式重定向到 file。

n > file

將檔案描述符為 n 的檔案重定向到 file。

n >> file

將檔案描述符為 n 的檔案以追加的方式重定向到 file。

n >& m

將輸出檔案 m 和 n 合併。

n <& m

將輸入檔案 m 和 n 合併。

<< tag

將開始標記 tag 和結束標記 tag 之間的內容作為輸入。

linux 中執行命令的2 1的含義

我們在linux下經常會碰到nohup command dev null 2 1 這樣形式的命令。首先我們把這條命令大概分解下首先就是乙個nohup表示當前使用者和系統的回話下的進城忽略響應hup訊息。是把該命令以後臺的job的形式執行。那麼就剩下command dev null 2 1,comma...

Linux shell 關於 2 1 的含義

0 表示標準輸入 1 表示標準輸出,即stdout 2 表示標準錯誤輸出,即stderr 預設為標準輸出重定向,與 1 相同 2 1 意思是把標準錯誤輸出重定向到標準輸出.file 意思是把標準輸出和標準錯誤輸出 都重定向到檔案file中 dev null 可以看作黑洞,它等價於乙個只寫檔案,所有寫...

bat shell 命令列中 2 1 的含義

bat shell 命令列中 2 1 的含義 command dev null 2 1 藍字部分 只適用於linux 的shell,先當於沒有輸出,輸出的內容被吞噬掉了,可用提高速度 window使用 command null 綠字部分 window bat檔案,cmd 命令列視窗 shell檔案,...