运行eval命令后控制到下一个语句

时间:2012-12-27 22:02:10

标签: bash

我编写了一个bash脚本来在后台运行服务并从脚本退出到命令行。但是在运行eval命令之后,控件不会进入下一个语句。

COMMAND="nohup java -jar jenkins.war"
echo "starting service"
eval $COMMAND
echo "service running"
exit

回显“服务正在运行”并且退出永远不会发生。我想在后台运行该进程,并在服务仍在运行时返回到命令提示符。我该怎么做?

4 个答案:

答案 0 :(得分:12)

请不要将带有参数的命令放在字符串中。将您的命令及其参数放在数组中(并且不要使用大写的变量名,这是非常糟糕的做法),不要使用eval eval是邪恶的!

command=( nohup java -jar jenkins.war )
echo "starting service"
"${command[@]}" 2> /dev/null &
echo "service running"

&是让命令在后台运行。

答案 1 :(得分:3)

尝试:

command="java -jar jenkins.war"
echo "starting service"
$command </dev/null >jenkins.out 2>jenkins.err &
echo "service running"

答案 2 :(得分:2)

eval没有解决这个问题,你需要'run-in-background'字符,即'&amp;' (没有引号)。

将您的行重写为

 #eval $COMMAND
 $COMMAND &

根据您在$ COMMAND中的其他内容,您可能需要重新设置eval

此外,根据您的需要,在后台运行流程会产生一些jobs输出,即

[1]     10079

到控制台的std-error。您需要一些额外的语法将其重定向到/ dev / null。这是一个例子:

COMMAND="sleep 10"
{ $COMMAND & ; } 1>/dev/null 2>&1

使用流程组({ .... ; }不应该导致任何问题,但可能会出现问题。

IHTH

答案 3 :(得分:2)

在通话结束时添加&符号:

eval $COMMAND &