2016-07-29 837 views
-1

我准备了一个shell脚本来运行一个Java文件。我已经给出了Java路径,类路径和依赖关系。我正在执行基于条件的文件。Linux shell脚本执行挂起

以下是代码片段。代码正在执行,但控件不会出现提示。

CMD=""$JRE_BIN_PATH/java" $SP -cp $CP org.aditya.test.MainClass "[email protected]"" 

if [ "$1" == 'server' ] && [ "$2" == 'start' ] 
then 
$CMD & 
elif [ "$1" == 'process' ] 
then 
$CMD & 
else 
$CMD 
fi 

命令,因为它是使用在末端“&”挂起时ifelif执行。但是,如果控制权转到其他(不包括'&')控制立即出来。我已经删除'&',一切正常。我的问题是,CMD结束时'&'的用法是什么。它为什么会导致问题。

+0

'CMD =“”$ JRE_BIN_PATH/java“$ SP -cp $ CP org.aditya.test.MainClass”$ @“”' - 在shell中引用并不像你认为的那样工作,那些多余的双引号aren不要把它变成CMD的值 – davmac

+2

可能的重复[在bash中,为什么shell命令在参数作为变量传递给参数时忽略参数中的引号?](http://stackoverflow.com/questions/12136948/in-bash-why-do-shell-commands-ignore-quotes-in-arguments-when-the-arguments-are) – tripleee

+0

也http://mywiki.wooledge.org/BashFAQ/050 – tripleee

回答

1

基本上,&是“在后台运行”的Linux shell标记。该任务将立即分叉然后返回。它不会访问父进程的标准输入和输出。

对于需要用户输入的任务,您绝对不应该使用&&应保留用于后台任务,如服务或独立维护任务(请注意,在标准行为下,除非使用诸如screen之类的工具,否则后台任务可能会在终止后台运行的父进程终止时终止

+0

你在这里所做的一些陈述并不完全正确。 “它不会访问父进程的标准输入和输出” - 甚至不能确定你的意思,但子进程当然仍然继承那些文件句柄,并且可以写入与父进程相同的输出通道。 “你永远不应该用&需要用户输入的任务” - 在一个脚本中,这可能或多或少是真实的,但是一般来说,后台需要用户输入的进程是很好的;您当然需要将其前景以提供输入。 – davmac

+0

你是部分正确的:它会继承stdout/stderr,但不是stdin。 –

+0

同样,这是不正确的。它肯定会继承stdin。 – davmac