Ich verwende ProcessBuilder
, um meinen Befehl zu erstellen. Ich möchte meinen Befehl nach diesen Beitrag bauen: How do I launch a java process that has the standard bash shell environment?Hinzufügen von Anführungszeichen in ProcessBuilder
nämlich mein Befehl so etwas wie dieses: /bin/bash -l -c "my program"
Allerdings habe ich Schwierigkeiten habe die doppelten Anführungszeichen in ProcessBuilder
passieren, wie new ProcessBuilder(List<String> command)
zu gescheiterten Ausdruck der Befehl, wenn ich nativ doppelte Anführungszeichen zu List<String> command
hinzufügen. ProcessBuilder
erkennt die doppelten Anführungszeichen als Argument.
Relevante Code:
//Construct the argument
csi.add("/bin/bash");
csi.add("-l");
csi.add("-c");
csi.add("\"");
csi.add(csi_path);
csi.add(pre_hash);
csi.add(post_hash);
csi.add("\"");
String csi_output = Command.runCommand(project_directory, csi);
public static String runCommand(String directory, List<String> command) {
ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File(directory));
Process process;
String output = null;
try {
process = processBuilder.start();
//Pause the current thread until the process is done
process.waitFor();
//When the process does not exit properly
if (process.exitValue() != 0) {
//Error
System.out.println("command exited in error: " + process.exitValue());
//Handle the error
return readOutput(process);
}else {
output = readOutput(process);
System.out.println(output);
}
} catch (InterruptedException e) {
System.out.println("Something wrong with command: " +e.getMessage());
} catch (IOException e) {
System.out.println("Something wrong with command: " +e.getMessage());
}
return output;
}
Ps: Ich will ProcessBuilder
statt Runtime.getRuntime.exec()
verwenden, weil ich den Befehl in einem bestimmten Verzeichnis ausgeführt werden müssen. Ich muss ProcessBuilder.directory()
verwenden.
Ps: Der Befehl wird nach dem Ausführen mit 2 beendet. Es scheint, dass das System diesen Befehl erkennen kann. Die seltsame Sache ist, dass es nach dem Beenden mit 2 keine Ausgabe hat.
Ps: Der erwartete Befehl ist /bin/bash -l -c "/Users/ryouyasachi/GettyGradle/build/idea-sandbox/plugins/Getty/classes/python/csi 19f4281 a562db1"
. Ich habe den Wert ausgedruckt und es war korrekt.
Sie sollten nicht müssen. Jedes Element in der 'Liste' wird als einzelnes Argument an den Befehl übergeben. Übergeben Sie einfach eine 'Liste' an den 'ProcessBuilder'. –
MadProgrammer
Das würde bedeuten, dass ich' new ProcessBuilder '(sb.toString()) ändern müsste. 'to' new ProcessBuilder (command) ' – MadProgrammer
Denken Sie daran, der Grund für die Verwendung von' "..." 'in der Befehlszeile ist, den Leerraum zu negieren, so dass alles zwischen den Anführungszeichen als ein einzelnes Argument an den Prozess – MadProgrammer