2015-05-12 24 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