2012-09-11 40 views
17

我無法圍繞此包裹我的頭。爲什麼/dev/null將被用作if聲明的輸入?以下是< /dev/null的用法?if()</ dev/null

if ($PROG --version) </dev/null> /dev/null 2>&1; then 
     $PROG 
else 
     echo "failed" 
     exit 1 
fi 

我(覺得)我的理解是> /dev/null 2>&1只是用來抑制來自stdoutstderr任何輸出。

回答

15

如果$PROG是希望從stdin輸入,您的腳本可能永遠拖延等待你輸入東西的程序。採用< /dev/null是提供一個空的輸入這樣的程序。你對>2>&1是正確的。

這段腳本正在檢查$PROG --version是否以0狀態(成功)退出,然後在沒有任何標誌的情況下運行該程序。如果$PROG --version失敗,腳本會迴應「失敗」並退出。

+0

謝謝。我仍然不確定這是多麼有用,如果我知道'$ PROG'是什麼,並且我知道'PROG --version'沒有等待輸入。例如,'PROG = autoconf'就是我看到這個的地方。而且我知道'autoconf --version'沒有等待輸入。在這種情況下它仍然有用嗎? –

+0

@Carl Norum,在這裏可以使用'if('$ PROG --version')'(帶尖括號)來執行命令,因此不需要' fduff

+0

尖括號? –

13

我想你想知道爲什麼重定向不在括號內。

在這一行:

if ($PROG --version) </dev/null> /dev/null 2>&1; then 

括號不是if語句的語法的一部分;他們只是指定命令分組。 (我花了一點時間來記住自己;在csh/tcsh中,括號是一個if語句的語法一部分。)

例如,這樣的:

(echo one ; echo two) | tr a-z A-Z 

會產生這樣的輸出:

ONE 
TWO 

在這種情況下,由於是$PROG --version單個命令中,括號是不必要的(除非$PROG擴展到多於一個的命令,但這是不可能的)。

因此重定向不適用於if語句;它適用於$PROG --version。目的是不提供輸入(如從空文件讀取)到$PROG,並放棄寫入標準輸出或標準錯誤的任何內容。如果$PROG是一個從標準輸入讀取的命令,即使使用--version進行調用,如果沒有輸入重定向,它可能會等待鍵盤輸入。

該腳本假定只有在$PROG --version不會產生錯誤時才調用$PROG(無論它可能是什麼)是安全的。

請注意,您可以申請對重定向的if語句:

if test_command ; then 
    something 
else 
    something_else 
fi </dev/null> /dev/null 2>&1 

這種重定向輸入和輸出test_commandsomethingsomething_else

+0

謝謝你的回答!關於括號,我確實感到困惑。感謝您爲我分解並舉例說明。很好的解釋。 –

相關問題