我無法圍繞此包裹我的頭。爲什麼/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
只是用來抑制來自stdout
和stderr
任何輸出。
我無法圍繞此包裹我的頭。爲什麼/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
只是用來抑制來自stdout
和stderr
任何輸出。
如果$PROG
是希望從stdin
輸入,您的腳本可能永遠拖延等待你輸入東西的程序。採用< /dev/null
是提供一個空的輸入這樣的程序。你對>
和2>&1
是正確的。
這段腳本正在檢查$PROG --version
是否以0狀態(成功)退出,然後在沒有任何標誌的情況下運行該程序。如果$PROG --version
失敗,腳本會迴應「失敗」並退出。
我想你想知道爲什麼重定向不在括號內。
在這一行:
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_command
,something
,和something_else
。
謝謝你的回答!關於括號,我確實感到困惑。感謝您爲我分解並舉例說明。很好的解釋。 –
謝謝。我仍然不確定這是多麼有用,如果我知道'$ PROG'是什麼,並且我知道'PROG --version'沒有等待輸入。例如,'PROG = autoconf'就是我看到這個的地方。而且我知道'autoconf --version'沒有等待輸入。在這種情況下它仍然有用嗎? –
@Carl Norum,在這裏可以使用'if('$ PROG --version')'(帶尖括號)來執行命令,因此不需要' dev/null'? – fduff
尖括號? –