
我们经常会用如下代码在 Java 里调用系统命令:
Process proc =Runtime.getRuntime().exec("sh xxx.sh"); 但是,今天为了在调试模式下运行脚本,加了 -x 参数,发现没有效果,得到的脚本的输出流与没有 -x 参数一样。直接在shell里执行sh -x xxx.sh,是能出现调试效果的。 但在 jvm 里面,就无效了。另外测试了-n和-v参数,-n有效,-v无效。 请问这是什么原因呢?
参考资料:
[dmtsai@study ~]$ sh [-nvx] scripts.sh 选项与参数: -n :不要执行 script,仅查询语法的问题; -v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上; -x :将使用到的 script 内容显示到屏幕上,这是很有用的参数! 范例一:测试 dir_perm.sh 有无语法的问题? [dmtsai@study ~]$ sh -n dir_perm.sh # 若语法没有问题,则不会显示任何信息! 范例二:将 show_animal.sh 的执行过程全部列出来~ [dmtsai@study ~]$ sh -x show_animal.sh + PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/root/bin + export PATH + for animal in dog cat elephant + echo 'There are dogs.... ' There are dogs.... + for animal in dog cat elephant + echo 'There are cats.... ' There are cats.... + for animal in dog cat elephant + echo 'There are elephants.... ' There are elephants.... 1 Hieast 2020-05-29 00:43:45 +08:00 没写过 Java,单就问题来看建议查一下文档看 Runtime.getRuntime().exec 这种方式运行时标准输出跟当前进程是否一致。可以尝试 Process proc =Runtime.getRuntime().exec("sh -x xxx.sh > x.log"); 把标准输出重定向到文件,看文件里有没有输入。 |
2 itechify PRO 用数组来装命令和参数试试? |
3 binux 2020-05-29 01:08:18 +08:00 sh 不是同一个 sh |
4 momocraft 2020-05-29 01:31:11 +08:00 sh -x 的调试信息的输出是 stderr |
5 fmumu 2020-05-29 09:14:00 +08:00 via Android 把 process 的错误输出拿出来看看,exec 有几个重载方法都看看 |
7 Infernalzero 2020-05-29 10:08:51 +08:00 |
8 huaouo 2020-05-29 12:37:17 +08:00 via iPhone ProcessBuilder redirectOutput(ProcessBuilder.Redirect.INHERIT) redirectError(ProcessBuilder.Redirect.INHERIT) 试试? |
9 duanguyuan OP 问题解决啦!谢谢大家。 我在 github 上找到一段比较完整的代码: https://github.com/chenerzhu/quartz-console/blob/master/src/main/java/com/chenerzhu/quartz/executor/impl/ShellExecutor.java |