我最近一直在开发一个程序,该程序可以从Java程序编译并运行C ++程序,我已经使一切基本正常(或至少据我所知),但是后来我注意到有些东西被打印到错误流中:
cdog5000@srv3:~$ java -Xmx50m -jar main2.jar Running Command: sudo g++ --static -o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp" Err: g++: "/home/cdog5000/cody.cpp": No such file or directory Err: g++: no input files cdog5000@srv3:~$ ls -l total 4548 -rwxr-xr-x 1 cdog5000 cdog5000 1297588 Feb 3 23:11 a.out -rwxr-xr-x 1 cdog5000 cdog5000 7978 Feb 2 04:39 cody -rw-r--r-- 1 cdog5000 cdog5000 106 Feb 4 02:09 cody.cpp -rwxr-xr-x 1 cdog5000 cdog5000 1297357 Feb 4 02:09 cody.out -rw-r--r-- 1 root root 410433 Feb 4 02:48 log.txt -rwxr-xr-x 1 cdog5000 cdog5000 801088 Feb 1 05:24 main.jar -rw-r--r-- 1 cdog5000 cdog5000 804802 Feb 4 02:49 main2.jar drwxr-xr-x 3 cdog5000 cdog5000 4096 Feb 3 23:11 sandbox cdog5000@srv3:~$ sudo g++ --static -o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp"
如您所见,如果我通过SSH而不是Java代码进行操作,它会起作用吗?
Java代码:
public static Exec exec(String cmd){ Exec exec = new Exec(cmd); try { long current = System.currentTimeMillis(); Process proc = Runtime.getRuntime().exec(cmd); exec.setReturnValue(proc.waitFor()); exec.setRunTime(System.currentTimeMillis() - current); BufferedInputStream bos = new BufferedInputStream(proc.getInputStream()); byte b[] = new byte[1024]; String content = ""; while(bos.read(b) != -1) { content += new String(b); } exec.setStdIn(content.split("\n")); content = ""; bos = new BufferedInputStream(proc.getErrorStream()); while(bos.read(b) != -1) { content += new String(b); } exec.setStdErr(content.split("\n")); } catch (Exception e) { e.printStackTrace(); } return exec; }
感谢您的任何帮助,它已得到批准!
Err: g++: "/home/cdog5000/cody.cpp": No such file or directory
告诉你问题所在。
您的一级引号过多,因此您正在寻找"/home/cdog5000/cody.cpp"而不是/home/cdog5000/cody.cpp。
"/home/cdog5000/cody.cpp"
/home/cdog5000/cody.cpp
该的Runtime.exec文档说:
更精确地讲,使用字符串StringTokenizer将命令字符串分解为令牌,该StringTokenizer由调用new StringTokenizer(command)创建,而无需进一步修改字符类别。然后以相同的顺序将令牌生成器生成的令牌放置在新的字符串数组cmdarray中。
意味着它仅在空格上分割,而不像shell那样处理双引号。
许多语言都有两种功能,一种称为exec逐字运行命令,另一种system将字符串传递给外壳,外壳将在其中拆分单词并扩展通配符。
exec
system
我看不到systemJava中的通话,因此我认为您必须使用exec(String[] cmdarray)而不是exec(String command)。
exec(String[] cmdarray)
exec(String command)