一、shell 命令执行

      java 中shell编程可以用Runtime来执行命令,在idea中,有GeneralCommandLine。 

二、linux多条命令执行     

  在linux系统中,多条命令可以通过加分号来实现。如下:

       cd /root/xxx/idea-IC203/bin; sh idea.sh;

        这条命令是先进入到idea的bin目录中,然后执行idea.sh文件,启动idea。

三、Java中多条命令执行;

     经过测试,发现用Runtime 来添加多条命令,并用分号分隔,只能执行第一条命令,分号后的都无法执行,用&符号分割,也无法达到目的。

    在idea中的GeneralCommandLine,测试同样如此。

    既然这样,那无法可不可以通过拆分命令,将多条命令分别用一个独立的Runtime或者GeneralCommandLine方式来执行呢,答案是肯定的,但是问题又来了,我们的程序,尤其是idea插件开发中,我发现第一个GeneralCommandLine执行后会造成卡顿,第二个执行后,才会刷新界面。笔者用了一些其他方式,优化,发现这样分开执行,总是会出现一些问题,尤其是执行时间稍久一点的命令。分开执行,意味着要处理先后顺序,要等待。特别是其他逻辑和这些又关联,就会造成开发复杂度急升,有没有更好的方式呢,答案是有的。

四、bin/csh引入

    多条命令,可以通过/bin/csh方式来执行。如下:

GeneralCommandLine commandLine = new GeneralCommandLine();
commandLine.setWorkDirectory("/root/xxxx/xxxx/idea-203/bin");
commandLine.setExePath("/bin/csh");
commandLine.addParameter("-c");
commandLine.addParameter("ping www.baidu.com; sh idea.sh");

需要注意的是,"ping www.baidu.com; sh idea.sh"这条命令是一个字符串,作为一个独立的参数。就是说,多条命令不能单独添加参数,要拼接成一个参数。

另外,顺便提一下,在linux中,环境变量是个非常头痛的问题,如果终端没有设置环境变量,idea中如果需要用到环境变量还需要重启,有没有方式可以不重启呢,发现通过/bin/csh方式就可以解决这个问题。如下:
GeneralCommandLine commandLine = new GeneralCommandLine();
commandLine.setWorkDirectory("/root/xxxx/xxxx/idea-203/bin");
commandLine.setExePath("/bin/csh");
commandLine.addParameter("-c");
commandLine.addParameter("source /home/sxxx/xxx/project.ini; make clean;echo $?; make run....");
这条命令中,source /home/sxxx/xxx/project.ini,就是去执行project.ini脚本,让其中的环境变量project_name生效,echo $project_name 可以打印环境变量, make run ....这条命令才是需要执行的某某程序,而这个程序需要用到环境变量$project_name
echo $?可以打印make clean执行后process的exitcode。
Runtime类似,这里不再重复。

一文说Runtime中间加上 & 或者 && 就可以执行多条了,读者可以测试,但是在idea插件开发中,某些功能无法用Runtime替换GeneralCommandLine 。
Runtime.getRuntime().exec("cmd1 && " +
"cmd2 && " +
"cmd3 && " );