我在/tmp/padm
文件夹中有一个名为test.sh
的shell脚本。 在那个shell脚本中我有一个单一的语句
echo "good"
我正在尝试使用Java代码运行shell脚本。
String cmd=("/tmp/padm/.test.sh"); Runtime rt = Runtime.getRuntime(); Process pr=rt.exec(cmd);
但是我的问题是我无法看到shell脚本输出的“好”。
我怎样才能让脚本运行?
您可以通过以下代码获取命令输出。 希望这可以帮助。
Process process = Runtime.getRuntime().exec(cmd); String s = ""; BufferedReader br = new BufferedReader(new InputStreamReader(process .getInputStream())); while ((s = br.readLine()) != null) { s += s + "\n"; } System.out.println(s); BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream())); while (br2.ready() && (s = br2.readLine()) != null) { errOutput += s; } System.out.println(errOutput);
这是行不通的。 您必须在脚本的第一行添加“hash bang”,告诉Linux必须使用合适的解释器(例如bash)来解释脚本,或者通过明确地从Java运行bash。
当你说“在码头上”是什么意思? 如果您想查看过程中的输出/错误,则需要使用:
process.getErrorStream(); process.getOutputStream();
除此之外,从使用Runtime.exec
调用shell脚本中可以看到没有问题
process.getErrorStream(); process.getOutputStream();
正如oxbow_lakes指出的那样是正确的做法。
另外请确保你的exec /bin/sh
的shell脚本位置作为参数。
试试这个,一定会有用的。
Shell脚本test.sh代码
#!/bin/sh echo "good"
Java代码来执行shell脚本test.sh
try { Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(new String[]{"/bin/sh", "/tmp/padm/.test.sh"}); BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line = ""; while ((line = input.readLine()) != null) { System.out.println(line); } } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); }
这是一个需要运行一个shellscript的示例java代码的副本。
我的答案中的示例程序确实打印出标准错误和标准输出(示例程序稍后添加)。
请注意,streamGobblers在单独的线程中运行,以防止由于完整的输入/输出缓冲区而导致的执行问题。
如果你希望的话,你可以让StreamGobblers将输出存储在列表中,并且在执行完这个过程之后取出列表,而不是直接在stdout上进行转储。