Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> LINUX Shell中為什麼會有"2>&1"

LINUX Shell中為什麼會有"2>&1"

日期:2017/2/7 14:26:06      編輯:Linux教程
 

經常可以在一些腳本,尤其是在crontab調用時發現如下形式的命令調用

./t.sh >/dev/null 2>&1
前半部分./t.sh >/dev/null很容易理解,那麼後面的2>&1是怎麼回事呢?

要解釋這個問題,還是得提到文件重定向。我們知道>和<是文件重定向符。那麼1和2是什麼?在shell中,每個進程都和三個系統文件相關聯:標准輸入stdin,標准輸出stdout和標准錯誤stderr,三個系統文件的文件描述符分別為0,1和2。所以這裡2>&1的意思就是將標准錯誤也輸出到標准輸出當中。

下面通過一個例子來展示2>&1有什麼作用:


1234 $ cat ./t.sh#!/usr/bin/zshttttttecho "test"


t.sh中包含兩個命令,其中tttttt是一個不存在的命令,執行會報錯,默認情況下,錯誤會輸出到stderr。echo則能正確執行,並且輸出字符串信息到stdout。這裡標准輸出已經重定向到了 /dev/null。那麼標准錯誤也會輸出到/dev/null

 

 

 

為何2>&1要寫在後面?

首先是./t.sh >/dev/null 2>&1將標准輸出重定向到/dev/null中, 2>&1 是標准錯誤拷貝了標准輸出的行為,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。 ./t.sh 2>&1 >/dev/null 中 2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是在終端。>/dev/null後輸出才被重定向到/dev/null,但標准錯誤仍然不會被改變到/dev/null

 


測試結果如下:


1234567891011121314 ➜ workspace ./t.sh ./t.sh:2: command not found: ttttttest➜ workspace ./t.sh >/dev/null./t.sh:2: command not found: ttttt➜ workspace ./t.sh ./t.sh:2: command not found: ttttttest➜ workspace ./t.sh >/dev/null./t.sh:2: command not found: ttttt➜ workspace ./t.sh >/dev/null 2>&1➜ workspace ./t.sh 2>&1 /dev/null./t.sh:2: command not found: ttttttest
 

Copyright © Windows教程網 All Rights Reserved