2017-07-23 6 views
0

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.

+0

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

+0

Das würde bedeuten, dass ich' new ProcessBuilder '(sb.toString()) ändern müsste. 'to' new ProcessBuilder (command) ' – MadProgrammer

+0

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

Antwort

0

Der beste Weg, um Ihr Problem zu beheben, besteht darin, den Befehl zuerst zu erstellen und an die Liste zu übergeben. Also, anstatt all das zu tun.

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("\""); 

sollten Sie zunächst den Befehl konstruieren

StringBuilder sb = new StringBuilder(); 
sb.append("/bin/bash -l -c"); 
sb.append("\""+csi_path+pre_hash+post_hash+"\"");// add whitespace between the varaible, if required. 
System.outprintln(sb.toString()); //verify your command here 

csi.add(sb.toString()); 

Überprüfen Sie auch, alle über Variablenwerte.

+0

Ich versuchte Ihren Ansatz. Es scheint, dass es "/ bin/bash -l -c" nicht erkennen kann.Die Ausgabe ist 'Kann Programm nicht ausführen"/bin/bash -l -c "(im Verzeichnis"/Benutzer/ryouyasachi/Getty/Semantiful-Differentials-getty/getty/dsproj "): Fehler = 2, keine solche Datei oder Verzeichnis" –

+0

können Sie den gleichen Befehl manuell ausführen? – Ravi

+0

Auch ich habe mehrfach erwähnt, bitte überprüfen Sie Ihre Variablen – Ravi

0

Danke für @Ravis Idee!

//Construct the argument 
    csi.add("/bin/bash"); 
    csi.add("-l"); 
    csi.add("-c"); 
    csi.add("\"" + csi_path + " " + pre_hash+ " " + post_hash + "\""); 


    String csi_output = Command.runCommand(project_directory, csi); 

Die Process hat jedes Argument separat zu ergreifen, um den Befehl zu erkennen. Der schwierige Teil ist, daß in meinem gewünschten Befehl /bin/bash -l -c "/mypath/csi"

"/mypath/csi" muss durch Process als ein einziges Argument betrachtet werden.

Verwandte Themen