java 使用 ProcessBuilder 运行 shell 脚本
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/45570827/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Running a shell script using ProcessBuilder
提问by Alvp
I am trying to run a script using Java and ProcessBuilder. When I try to run, I receive the following message: error=2, No such file or directory.
我正在尝试使用 Java 和 ProcessBuilder 运行脚本。当我尝试运行时,收到以下消息:error=2, No such file or directory。
I dont know what I am doing wrong but here is my code (ps: I tried to execute just the script without arguments and the error is the same:
我不知道我做错了什么,但这是我的代码(ps:我试图只执行没有参数的脚本,错误是一样的:
String[] command = {"/teste/teste_back/script.sh, "+argument1+", "+argument+""};
ProcessBuilder p = new ProcessBuilder(command);
try {
// create a process builder to send a command and a argument
Process p2 = p.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line;
log.info("Output of running " + command + " is: ");
System.out.println("Output of running " + command + " is: ");
while ((line = br.readLine()) != null) {
log.info(line);
}
}
采纳答案by Computer Science Engineer
Try replacing
尝试更换
String[] command = {"/teste/teste_back/script.sh, "+argument1+", "+argument+""};
with
和
String[] command = {"/teste/teste_back/script.sh", argument1, argument};
Refer ProcessBuilderfor more information.
有关更多信息,请参阅ProcessBuilder。
ProcessBuilder(String... command)
Constructs a process builder with the specified operating system program and arguments.
ProcessBuilder(字符串...命令)
使用指定的操作系统程序和参数构造进程构建器。
回答by Adder
Unless your script.sh has a comma in its name, that is the mistake:
除非您的 script.sh 名称中有逗号,否则就是错误:
String[] command = {"/teste/teste_back/script.sh" , argument1, argument};
回答by binbjz
You can define a method with ProcessBuilder.
您可以使用 ProcessBuilder 定义方法。
public static Map execCommand(String... str) {
Map<Integer, String> map = new HashMap<>();
ProcessBuilder pb = new ProcessBuilder(str);
pb.redirectErrorStream(true);
Process process = null;
try {
process = pb.start();
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader reader = null;
if (process != null) {
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
}
String line;
StringBuilder stringBuilder = new StringBuilder();
try {
if (reader != null) {
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (process != null) {
process.waitFor();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (process != null) {
map.put(0, String.valueOf(process.exitValue()));
}
try {
map.put(1, stringBuilder.toString());
} catch (StringIndexOutOfBoundsException e) {
if (stringBuilder.toString().length() == 0) {
return map;
}
}
return map;
}
You can call the function to execute shell command or script
您可以调用该函数来执行shell命令或脚本
String cmds = "ifconfig";
String[] callCmd = {"/bin/bash", "-c", cmds};
System.out.println("exit code:\n" + execCommand(callCmd).get(0).toString());
System.out.println();
System.out.println("command result:\n" + execCommand(callCmd).get(1).toString());