2017-05-24 61 views
2

我想創建可以在冗長,無聲模式,如果優選地同時運行的腳本。我的想法是創建一個包含"&> /dev/null"一個變量,如果腳本拼命地跑默默我只是將其清除。在靜音模式下工作正常,但如果我想通過這個作爲最後一個「說法」的東西(見我的例子向下)這是行不通的。重定向STDOUT由變量在擊

下面是一個例子: 我想zip東西(我知道有一個-q選項,這個問題更像theorethical),如果我寫這篇文章它的作品,因爲我打算:

$ zip bar.zip foo 
    adding: foo (stored 0%) 
$ zip bar.zip foo &> /dev/null 
$ 

但當我宣佈&> /dev/null作爲一個變量,我得到這樣的:

$ var="&> /dev/null" 
$ zip bar.zip foo "$var" 
zip warning: name not matched: &> /dev/null 
updating: foo (stored 0%) 

我看到其他的解決方案,通過重定向意向劇本的部分,但我很好奇,如果我的想法可以工作,如果沒有,W不是嗎? 這將是更方便地使用這樣的事情在我的劇本,因爲我只需要重定向一些線條或命令,但過多地與if圍繞每個:

我想這樣的事情是明確的:

if verbose 
verbose="&> /dev/null" 
else 
verbose= 

command1 $1 $2 
command2 $1 
command3 $1 $2 $3 "$verbose" 
command4 
+0

使用eval:'eval zip bar.zip foo「$ var」'。如果 – pynexj

+1

或使用的語句:'如果條件;然後命令; else命令>&/ dev/null; fi' – pynexj

+0

正如上面和下面提到的,我不想用'if's來包圍所有的東西,並且'eval'是不鼓勵的。 – Wax

回答

3

bash將認識到/dev/stdout文件名作爲標準輸出,具有重定向使用時,不管是不是你的文件系統有這樣一個條目。

# If an argument is given your script, use that value 
# Otherwise, use /dev/stdout 
out=${1:-/dev/stdout} 

zip bar.zip foo > "$out" 
0

您的問題是由外殼進行擴展的順序。在將命令傳遞到命令後,該變量將替換爲stdout重定向zip

您需要shell在調用zip命令之前展開該變量。要做到這一點,你可以使用eval這需要在擴大變量,這樣的第一關。

eval zip bar.zip foo "$var"

然而厭倦使用eval,因爲未經檢查值可以導致攻擊,它的使用一般不提倡。

你可以考慮設置你自己的文件描述符並將其設置爲/ dev/null,一個真實文件甚至標準輸出。然後每一個應該去那些的一個命令是:

zip bar.zip foo > 3

http://www.tldp.org/LDP/abs/html/io-redirection.html#FDREF