2015-05-12 53 views
4

對於執行命令存儲在變量的eval命令用於:如何在bash超時和eval命令組合

└──> a="echo -e 'a\nb' | wc -l" 
└──> eval $a 
2 

但如何才能將其與timeout命令相結合?我試過下面這給了我錯誤的輸出:

└──> timeout 10 $a 
'a 
b' | wc -l 

而這給了我錯誤的情況如下:

└──> timeout 10 "$a" 
timeout: failed to run command `echo -e \'a\\nb\' | wc -l': No such file or directory 

└──> timeout 10 $(eval $a) 
timeout: failed to run command `2': No such file or directory 

└──> timeout 10 $(eval "$a") 
timeout: failed to run command `2': No such file or directory 

問題也可以站在:我怎麼可以肯定的是下面的命令得到正確執行?

timeout 10 "$PROGRAM" "$OPT1" "$OPT2" ... 
+1

不要存儲在變量的命令。改爲使用[功能](http://tldp.org/LDP/abs/html/functions.html)。您可以重新聲明函數,就像您可以重新分配變量一樣。 – anishsane

+0

&要回答你的問題,你可以運行'eval'timeout 10 $ a「'。但是請記住['eval'是邪惡的](http://mywiki.wooledge.org/BashFAQ/048)&eval'的使用是[永遠不鼓勵](http://stackoverflow.com/questions/17529220/)爲什麼 - 應該 - 評估 - 避免 - 在 - 什麼 - 應該我使用 - 相反),除非絕對沒有其他方式。 – anishsane

+0

當我的'PROGRAM =「echo」''OPT1 =「Hello」'時,我甚至需要'eval'嗎?當有管道(如原始問題中提到的)或其他一些尷尬的字符時,我認爲'eval'是有用的。 –

回答

0

這將工作

if timeout "$PROGRAM" "$OPT1" "$OPT2" ... ; then 
    echo Program ran successfully 
else 
    echo Program terminated due to timeout 
fi 
0

如果它是關於保持命令中的變量,這將工作,雖然不知道這是否是一個「正確的bash的方式」來做到這一點:

command.sh:

#!/bin/bash 
echo -e 'a\nb' | wc -l 

run.sh:

#!/bin/bash 
a="command.sh" 
timeout 10 ./$a 
0

echo "$(timeout 10 echo -e 'a\nb' | wc -l)"
OR
echo "$(timeout 2 echo "$(eval $a)")"

解釋1瀏覽:HERE

解釋2瀏覽:HERE